こんにちは、ICS川勝です。

2015年3月にAdobeから2015年のFlashランタイムのロードマップが発表されました。Adobeは引き続きFlashPlayerとAIRランタイムの機能向上を進めており、四半期ごとのリリースに今回発表のあった機能を投入していく予定のようです。今回はこの中からStage3Dに関するものをいくつかピックアップして紹介いたします。

全てのAIRプラットフォームでStage3DのハードウェアデコードによるVideoTexture機能をサポート

VideoTextureはハードウェアアクセラレーションが有効なビデオ動画をStage3DのTextureオブジェクトとして扱うことができる機能です。実装上はビデオとVideoTextureとのリンクさえ設定してしまえば通常のTextureオブジェクトと同等に扱うことができるので、Stage3D上でビットマップのようにビデオの各ピクセルに高速にアクセスすることができます。また、現在ハードウェアアクセラレーションの有効なビデオ再生方法としてはStageVideo機能がありますが、StageVideoレイヤーの上に位置しているStage3Dレイヤーは現状透過することができないため、Stage3Dコンテンツとビデオ再生の親和性はあまり高くありませんでした。VideoTextureならStage3Dレイヤー内にハードウェアアクセラレーションの有効なビデオ動画を再生することができます。

Flashランタイムのレイヤー重なり順

StageVideoレイヤーはStage3Dレイヤーを透過して表示することはできない

以上のように、VideoTextureを使えば従来は難しかったビデオ動画のStage3Dコンテンツとの共存、及び高フレームレートでの複雑な画像処理が可能になり、コンテンツ表現の幅がさらに広がります。多くのモバイル端末にはカメラがついているので、特にモバイルAIRプラットフォームにとっては大きな新機能になりそうです。

Flash PlayerとAIRでAGAL3をサポート

Flash PlayerとAIRランタイムは多くのPC、プラットフォームをサポートしているため、Stage3Dは様々なハードウェア(GPU)環境で再生されることが考えられます。通常は多くの環境で均一の動作を保つため、GPUプログラミング可能なシェーダーの機能やリソースはあえて低め(古め)のGPU環境にあわせたものとなっています。この制限を開発者のターゲットに応じて緩和(場合によってはさらに規制)するために、プロファイル(Stage3Dで使用できる機能のグレード)を指定できる機能がContext3DProfileクラスとしてFlash Player 11.4で追加されました。

Adobe Graphics Assembly Language(AGAL)はStage3DでGPUへの命令を記述するための低レベルのシェーダー言語です。このAGALのバージョンも上記のプロファイルで選択できるグレードの1つで、動作するハードウェアが少なくなる代わりにAGALと比べて機能や命令、使用できるリソースを拡張したAGAL2を指定することができました。今回追加されるプロファイル「Standard Extended」で使用できるようになるAGAL3は今までのAGAL、AGAL2に比べてさらにGPUで使用できるリソースが増えました。

AGALバージョンごとのレジスタ数比較

AGAL3のアップデートで特に目を見張るのはTokens(命令長)の増加で、AGAL2と比べて2倍、AGALと比べれば約10倍にまで増えることになります。命令長とはシェーダーのGPUに対する命令の数で、AGALはアセンブリ言語のため、変数の代入すら1命令にカウントされてしまいます。たとえば、ActionScript 3.0で何気なく記述する以下のようなコードがあります。

//[ActionScript 3.0]
// RGBカラーの平均を取ります。
var color = (red + blue + green) / 3;

このコードと同じことを実現しようとAGALに書き換えると、このようになります。

//[AGAL]
// 変数ft0.xにカラー値rとgを加算して代入します。
add ft0.x, v0.r v0.g;

// カラー値r、gが加算された変数ft0.xにさらにカラー値bを加算します。
add ft0.x, f0.x v0.b;

// カラー値r、g、bが加算された変数ft0.xを定数3を代入してあるfc0.xで割ります。
div ft0.x, f0.x fc0.x;

普段は簡単な式と思っていても、AGALではかなりの命令数を消費してしまうことになるため、命令長上限の増加はかなりうれしいところです。3D空間に配置するライトの数や3Dモデルに仕込めるボーンの数など他オブジェクトに作用するような要素を増やすことができたり、長くなり過ぎてやむなく2回の処理にわけていたような画像処理シェーダー表現を1度に行えるようになります。

AIR for iOSとAndroidでETC2形式のATFをサポート

Adobe Texture Format(ATF)は圧縮されたテクスチャをStage3Dで使用するためのファイルフォーマットです。テクスチャは使用する際、GPU向けに圧縮しておけば処理の観点からもビデオメモリ使用の観点からも効率的になります。しかし、GPUの種類やプラットフォームによってサポートするテクスチャ圧縮形式に違いがあり、それぞれに対応した圧縮形式のテクスチャを読み込まなくてはなりません。ATFは開発者がターゲットにしたいプラットフォームそれぞれでサポートされているテクスチャ圧縮形式を選択してまとめてパックでき、実行時に自動で最適な圧縮形式のものを使用してくれる便利なフォーマットです。

iOSやAndroidなどの複数プラットフォーム向けの開発をワンソースで行えるのがAIRのメリットの一つですが、従来のATFでは、おおまかに言うとiOSでは「PVRTC」、Androidでは「ETC1」、Windows及びMac OSでは「DXT」という形式の圧縮テクスチャをそれぞれ用意する必要がありました。結果、圧縮形式が違うと見た目の劣化具合に差異が出ることがあり、プラットフォーム間で均一のクオリティを保てない場合がありました。また、場合によっては複数の圧縮形式を組み合わせてまとめなくてはならないため、アセットのファイルサイズにも影響があります。

新しいATFフォーマットでサポートするテクスチャ圧縮形式

新しいATFフォーマットならiOSとAndroid、2つのプラットフォーム向けに共通の圧縮フォーマットを選択することもできるため、ファイル容量削減につながる

今回、「ETC2」形式のATFがiOSとAndroid向けにサポートされるということは、少なくともこの2つのプラットフォームにおいてはこれらの問題に頭を悩ませなくてよくなるということになります。モバイルアプリ開発者にはかなりの朗報ではないでしょうか。

最後に

Stage3Dに関してはしばらくマイナーアップデート続きだった中、久しぶりにわくわくするような機能アップデートが予定されているようです。個人的にはAGAL3に関しては目に見える機能面の追加はなく、使用できるリソースの緩和のみに留まったことが少し残念ですが、今回のロードマップからStage3Dを機能拡張していくAdobeの姿勢が感じられました。今後のFlashプラットフォームにますます目が離せません。