必要条件

この記事に必要な予備知識

テクスチャファイル形式とActionScriptの経験はこの記事を理解する上で役に立ちます

ユーザーレベル

中級

Adobe Texture Format(ATF)については、Stage3D関連のドキュメント等で目にしたことがあるかもしれません。ATFはGPU描画を利用する際、圧縮されたテクスチャを効率よく使う手段を提供するファイルフォーマットです。Gaming SDKの一部として提供されるATF SDKは、ATFファイルの作成と検証に必要なツールを含んでいます。この記事では、ATFの概要と、ATF SDKを使用してテクスチャを作成する方法を紹介します。なお、この記事はIntroducing compressed textures with the ATF SDKを再編集したものです。

ATFの基本情報

最初に、GPUがサポートするテクスチャ形式の種類とその特徴を整理します。

GPUプログラミングで利用できるテクスチャは2種類に分けることができます。GPUがサポートするテクスチャとサポートしないテクスチャです。GPUがサポートする形式のテクスチャはGPUメモリに保管できます。これは、一旦CPUからアップロードすればGPUメモリ上のテクスチャが再利用が可能なため効率的です。一方、GPUがサポートしない形式のテクスチャが保管されるのはCPUメモリ上です。例えば、PNGはGPUが対応しないファイル形式のため、CPUメモリ上に展開されます。更に、JPEGのようなGPUが対応しない圧縮画像の場合には、CPUリソースを使ったデコード処理の後、テクスチャがCPUメモリを使用する状態になります。

一般的に、テクスチャの処理は、CPUよりもGPUを使用できたほうが効率的です。そのためGPUがサポートする形式のテクスチャを利用するのが望ましいと考えられます。しかし、GPUの種類によって、サポートするテクスチャの形式は様々です。しかもプラットフォームによっては、ハードウェアのチップセット毎にサポートする圧縮テクスチャが異なります。表1に、この違いをまとめました。


表1.プラットフォーム/チップセット別の圧縮テクスチャ形式

プラットフォーム チップセット テクスチャの形式
iOS Imagine Technologies PVRTC
Android Qualcomm ETC1
Android Mali ETC1
Android NVidia ETC1/DXT1/DXT5
Android PowerVR PVRTC/ETC1
Windows (すべて) DXT1/DXT5
Mac OS (すべて) DXT1/DXT5

ATFを使うメリット

表1を見ると、iOS、Android、デスクトップをターゲットにしてGPU描画を行うアプリケーションを開発する場合は、それぞれのプラットフォームに合った形式の圧縮テクスチャを用意したいところです。例えば、全てのアセットに対して以下のデータを用意することになるかもしれません。

  • WindowsおよびMac OS用にDXT
  • Android用にETC1またはDXT
  • iOS用にPVRTC

更に、実行時には、アプリケーションの動作環境を判定して、アップロードするテクスチャを選ぶという処理も必要になります。結果としてテクスチャファイルの管理や動作確認の手間が増えそうです。手間が増えるのは嬉しくありませんよね?ATFはここで役に立ちます。ATFは複数のテクスチャを1つにまとめるフォーマットです。そしてStage3DはATFに対応しています。つまりFlash PlayerやAdobe AIRが実行中のプラットフォームに合ったテクスチャデータを勝手に抽出してくれます。そのため開発者はプラットフォームを意識することなくATFテクスチャファイルだけを扱っていれば良いわけです。

ATFのメリットには、種々の圧縮テクスチャ形式を単一ファイルにまとめるだけでなく、以下のようなものもあります。

  • レンダリングが速くなる
  • テクスチャに必要なメモリ量が少なくなる(メモリが非常に限られている第1世代のiPadなどのデバイスでは非常に重要)
  • テクスチャデータのアップロード時間の短縮
  • 必要な全てのミップマップの自動生成(無効にすることも可能)
  • 同じメモリ量でも高画質のテクスチャの利用(圧縮テクスチャを使用する場合)

ATFの内部構造

ATFは複数の圧縮された画像を保持するコンテナのようなものです。通常は、クロスプラットフォームで利用できるように、テクスチャの全ての圧縮形式(PVRTC、ETC1、DXT1/DXT5)がATFファイルに埋め込まれます(図1を参照)。

このようなATFファイルを渡せば、どのプラットフォームでもAIRまたはFlash Playerが適切なテクスチャを自動的に取り出します。とはいえ、特定のプラットフォームだけをターゲットにしたい場合もあるでしょう。例えば、モバイル専用のアプリケーションに、デスクトップ用のテクスチャを埋め込む必要はありません。その上、iOSのみを対象としている場合なら、Android用のテクスチャは不要です。そこで、ATFファイルには必要な種類の圧縮テクスチャだけを埋め込みむこともできるようになっています。iOS専用のATFアセットには、PVRTCテクスチャだけを格納してアセットの軽量化を図ることができます(図2を参照)。

Androidだけをターゲットにしている場合は、ETC1のみ保持すればよいはずです。

注:Flashランタイムは、アルファ値を持つ画像に関しては、ETC1形式の場合、アルファチャンネル用とカラーチャンネル用の2つのETC1ファイルを使用します。

デスクトップ専用のアセットのATFファイルには、DXTテクスチャのみをパッケージします(図4を参照)。

DXT1とDXT5フォーマットの違いは、アルファ値のサポートの有無です。DXT1はアルファ値サポートしませんが、DXT5はサポートします。ATF SDKでDXTを作成する場合は、画像に透過情報が含まれているかを判断して、適切なDXTバージョンが選択されます。ATFは、事前にアルファ値が乗算されていない点には注意してください。

必要であれば、ATFファイル内に非圧縮テクスチャを保持することもできます(図5を参照)。

非圧縮のテクスチャを使って、キューブマップ、自動ミップマップ、テクスチャのストリーミングを使用したい場合などは、この方法が有効かもしれません。

ATFツールの使い方

ATFの構造については大まかに理解できたでしょうか?次はATFファイルの作成方法を説明します。必要なツールはATF SDKに含まれています。ATFファイル作成のためのコマンドラインツールや、ATFファイルのプレビューや検証に使用するATFViewerというツールが提供されています。

ATF SDKに含まれる全てのツールおよびコマンドラインの使用方法は、ATFツールの使い方を確認してください。

png2atf

png2atfは、その名前のとおりPNGファイルをATFファイルに変換するツールです。以下は、png2atfの使用例です。

//leaf.pngを3種類の形式(DXT5、PVRTC、 ETC1x2)でパッケージする > png2atf.exe ‐c ‐i leaf.png ‐o leaf.atf [In 213KB][Out 213KB][Ratio 99.9703%][LZMA:0KB JPEG‐XR:213KB] //特定範囲のミップマップとパッケージする > png2atf.exe ‐c ‐n 0,5 ‐i leaf.png ‐o leaf0,5.atf [In 213KB][Out 213KB][Ratio 99.8825%][LZMA:0KB JPEG‐XR:213KB] //DXT形式のみパッケージする > png2atf.exe ‐c d ‐i leaf.png ‐o leaf_dxt5.atf [In 85KB][Out 85KB][Ratio 100.045%][LZMA:0KB JPEG‐XR:85KB] //ETC1形式のみパッケージする > png2atf.exe ‐c e ‐i leaf.png ‐o leaf_etc1.atf [In 85KB][Out 85KB][Ratio 100.045%][LZMA:0KB JPEG‐XR:85KB] //ETC1形式のみパッケージする > png2atf.exe ‐c p ‐i leaf.png ‐o leaf_pvrtc.atf [In 42KB][Out 42KB][Ratio 100.089%][LZMA:0KB JPEG‐XR:42KB]

非圧縮のテクスチャを保持したい場合は、単純に引数-cを省略します。

//非圧縮(RGBA)形式でパッケージする > png2atf.exe ‐i leaf.png ‐o leaf_uncompressed.atf [In 341KB][Out 43KB][Ratio 12.8596%][LZMA:0KB JPEG‐XR:43KB]

もう1つのATFのメリットは、ストリーミングに使えることでした。以下は、3つのサブファイルを生成する例です。

png2atf ‐m ‐n 0,0 ‐c ‐i cubecat0.png ‐o cubecat_c_high.atf png2atf ‐m ‐n 1,2 ‐c ‐i cubecat0.png ‐o cubecat_c_med.atf png2atf ‐m ‐n 3,20 ‐c ‐i cubecat0.png ‐o cubecat_c_low.atf

テクスチャストリーミングはFlash Player 11.3/AIR 3.3から導入された機能です。Context3DオブジェクトのcreateTexture()メソッドを使って、Textureインスタンスを作成する際に、引数streamingLevelの値を指定して、テクスチャストリーミングを有効にするのを忘れないようにしましょう。

そして、キューブマップテクスチャをATFファイルにパッケージする場合は以下のようにします。

//キューブマップテクスチャのATFファイルを作成する //次のようにキューブ各面のpngファイルを用意する // ‐X: cube0.png // +X: cube1.png // ‐Y: cube2.png // +Y: cube3.png // ‐Z: cube4.png // +Z: cube5.png > png2atf.exe ‐c ‐m ‐i cube0.png ‐o cube.atf

pvr2atf

Apple texturetoolを使ってPVRテクスチャを作成している場合は、pvr2atfを使ってPVRテクスチャファイルをATFファイルに変換できます。このツールは、入力ファイルの形式がPVRでなければならないことを除けばpng2atfと同じように使えます。

「test.pvr」というPVRファイルを、RGBまたはRBGA ATFファイルに変換する場合は、以下のコマンドを実行します。

> pvr2atf -r test.pvr -o test.atf [In 4096KB][Out 410 KB][Ratio 10.0241%][LZMA:0KB JPEG-XR:410KB]

ATFViewer

ATFViewerは、ATFファイルのプレビューや検証に使用するグラフィカルツールで、DXT1、ETC1、PVRTCの圧縮の様子の確認を第一の目的として提供されています。[File] > [Open]から選択するか、ファイルシステムからウィンドウにファイルをドラッグすると、ATFファイルをツール内に表示できます。

図6は、ATFViewerを使ってStarlingからのテストファイルを表示した例です。それぞれの形式のテクスチャをプレビューすることができます。また、画面の下部には、Stage3DにこのATFファイルを読み込むコードスニペットコードが表示されます。

ATFViewerで1種類の圧縮形式しか含まないATFファイルを開くと、その形式が表示されます。例えば、DXTテクスチャしか含まれていないATFファイルをプレビューすると、テクスチャの一覧にあるETC1とPVRTCは薄いグレーで表示されます(図7を参照)。

注:図6と7のスクリーンショットに表示されたActionScriptコードスニペットには小さな間違いがいくつかありますが、これらはツールの修正により対応される予定です。正しいコードは、次のセクション「ActionScriptで圧縮テクスチャを使うには」を参考にしてください。

その他のツール

以上のツールのほかにも、ATF SDKには、他の形式からのATFファイルの作成、PNGファイルの検証、ATFファイルの情報取得などに使用できるコマンドラインツールが含まれます。詳しくは、ATFツールの使い方をご確認ください。

ActionScriptで圧縮テクスチャを使うには

ActionScriptから圧縮テクスチャを使用する方法は、Stage3DのAPIを直接利用するか、Starlingを使用するかで異なります。ATFテクスチャの全ての機能を利用するためには、以下の要件を満たす必要があります。

  • Starlingを使用する場合は、Starling 1.2以降を使用する。最新バージョンを取得
  • Stage3Dを直接使用する場合は、最新のAGALMiniAssemblerを使用する。最新のAGALMiniAssemblerを取得
  • AIR SDK 3.4以降を使用する。(Flash Builder 4.7にはAIR 3.4 SDKが同梱されている)
  • Flash Player 11.4以降またはAIR 3.4以降をターゲットにする。
  • 次のコンパイラ引数を追加する。"-swf-version=17"

Stage3Dを使う場合

Stage3DでATFを使うためには、Context3D.createTexture()メソッドを使って、Textureオブジェクトを作成します。その際、format引数には、Context3DTextureFormat.COMPRESSED_ALPHA、または、Context3DTextureFormat.COMPRESSEDを使用します。そして、最初の引数にATFファイルを指定して、TextureオブジェクトのuploadCompressedTextureFromByteArray()メソッドを呼び出します。例えば、

[Embed(source="mytexture.atf", mimeType="application/octet‐stream")] public static const TextureAsset:Class; public var context3D:Context3D; public function init():void { var texture:Texture = context3D.createTexture(256, 256, Context3DTextureFormat.COMPRESSED_ALPHA, false); var textureAsset:ByteArray = new TextureAsset() as ByteArray; texture.uploadCompressedTextureFromByteArray(textureAsset, 0); }

キューブマップテクスチャを使用する場合は、Context3D.createCubeTexture()メソッドを使用してCubeTextureインスタンスを作成します。

var texCubemap:CubeTexture = context3D.createCubeTexture(256, Context3DTextureFormat.COMPRESSED_ALPHA, false); var textureAsset:ByteArray = new TextureAsset() as ByteArray; texCubemap.uploadCompressedTextureFromByteArray(textureAsset, 0);

それから、テクスチャの形式によって、「dxt1」または「dxt5」のいずれかを、断片シェーダーのテクスチャサンプラーとして指定する必要があります。

  • テクスチャ形式が、Context3DTextureFormat.COMPRESSEDの場合は、「dxt1」を使う(テクスチャ形式がDXT、PVRTC、ETC1であっても)。
  • テクスチャ形式が、Context3DTextureFormat.COMPRESSED_ALPHAの場合は、「dxt5」を使う(テクスチャ形式がDXT、PVRTC、ETC1であっても)。
  • テクスチャ形式が、Context3DTextureFormat.BGRAの場合はどちらも使用しない。

ActionScriptでATFを組み込む実用的な例は、GitHubのStarling commit for ATF supportをご覧ください。StarlingがATFテクスチャをどのように読み込むかを確認できます。

Starlingを使う場合

Starlingを使う場合はずっと簡単です。Starlingは、Texture.fromAtfData()メソッドによりATFテクスチャをサポートします。下のコードは、StarlingでATFテクスチャからImageオブジェクトを作成する例です。

[Embed(source="starling.atf", mimeType="application/octet-stream")] public static const CompressedData:Class; var data:ByteArray = new CompressedData(); var texture:Texture = Texture.fromAtfData(data); var image:Image = new Image(texture); addChild(image);

より詳しくは、Starling Wikiページのusing ATF texturesをご確認ください。

次のステップ

ATF SDKを構成しているさまざまなツールの詳細および使用例については、ATFツールの使い方を参照してください。Stage3Dの詳細は、Stage3Dの仕組みを学ぶをご確認ください。