Flash3D/Molehillでできること
Molehillの俯瞰
やっとMolehillの話ができそうです。これまでPapervision3Dとjiglibflashを通して、Flashで3Dを描画する旧来の手法について眺めてきたのは、これが新しいFlashの3Dシステムでどう変化するかを考察するためでした。それでは、MolehillというコードネームのついたFlashの3D API群についてまずおさらいしてみましょう。
新しい3D用のAPIの目玉は高いフレームレートでたくさんのポリゴンの描画ができることです。旧来の擬似3Dが初代PlayStationぐらいの性能だとしたら、新しいAPIではPlayStation2ぐらいのことができると考えたらわかりやすいでしょうか?この性能アップを可能にするのは、GPUというグラフィック用の演算装置の積極利用です。近年のFlashPlayerは徐々にGPUの活用に乗り出していましたが、3Dエンジンを本格的に導入するにあたって、いろいろ手直しをして、2Dの描画などの改善も期待できるとか何とか。AppleのiPhoneやiPadに、パフォーマンスを理由にFlashを搭載してもらえなかったのがこたえたのかもしれません。(っていうか、Flashが得意な人たちはみんなGPUを叩かせろってずっと思ってたんじゃないでしょうか?)
ただ、GPUを操作する作法というものがありまして、FlashのSWFの命令体系のままでは冗長的すぎるのか、flash.display3D.Program3Dというクラスでバイトコードのプログラムを書いて実行するという方法が採用されました。DirectXやOpenGLが得意な人にとっては、そんなプログラマブルシェーダーな感じのものにすんなり入っていけると思いますが、そうでもない人のためにはPixel Bender 3Dというツールが提供されています。このツールでGPUにどんな操作をさせたいか記述すると、ActionScript用にバイトコードを出力してくれます。(AGALって名前だそうです。)
そんな面倒なことを考えなくても、Away3DやらAlternative3Dやら、既存のフレームワークが新しい3D APIに対応してくれるので、それを使っていればいいっていう場合も多いと思いますが、自分でGPUを叩かないと実現できないような表現もきっと出てくるんじゃないでしょうか。
プログラマブルシェーダー
Flashの3D APIで表現できるようになるGPUによる演算機能はとりあえず「バーテックスシェーダ」と「フラグメントシェーダ(ピクセルシェーダ)」に限られているようです。
(OpenGLやDirectXなどでは中間に「ジオメトリシェーダ」を入れることもできますが、とりあえず、それはないようです。)
バーテックスシェーダは、頂点に関する情報を操作するプログラムです。例えば、立方体を頂点をY座標値に従って回転させるようなプログラムを書けば、立方体がツイストした状態で描画されます。
バーテックスシェーダの計算が終わると、頂点データは2Dの座標に投影(ラスタライズ)されます。これまでのフレームワークいえば3DのポリゴンをDisplayObjectに変えて2D座標上に配置するような操作ですね。
ラスタライズされた2D状態をさらにフラグメントシェーダが処理します。各ピクセルの色情報や対応するテクスチャの点情報からそのピクセルの色を決定することができます。例えば中間色を減色して、アニメのようなトーンでレンダリングするのはフラグメントシェーダでできることの一つですね。
ピクセルシェーダで解決されることの一つにポリゴンのZオーダリングが不要になることが挙げられます。ピクセル一つずつに対して、奥行き座標位置のテストが行われるため、複雑な形状のモデリングデータだからといって旧来のフレームワークのように変なポリゴンが前面に表示されてしまうという問題は起こらなくなります。この問題があったために3D表現を断念していたFlashのプロジェクトもたくさんあったんじゃないかと思うぐらい気を使う部分でしたよね。
3Dレイヤー
3D APIの追加に伴って、Flash Playerの描画はいくつかの層に分かれることになるそうです。奥にビデオ用のステージ、その手前に3D描画ステージ、最前面に2Dオブジェクト(これまでのFlash)のステージが配置され、最終的にはそれらの層が重なって出力されるとのことです。3Dのゲームを作ったとして、ボタンなどのインターフェースは既存の2Dの方が利便性が高いケースも多いので、手前に2Dのオブジェクトが配置できるのはいいですね。
flash.display3Dパッケージ
新しい3D APIとして追加されたflash.display3Dパッケージの構成はいたってシンプルで、Context3Dクラスのインスタンスをステージに配置して、頂点の情報、頂点のつなぎ方(インデックス)の情報、シェーダの情報をそのインスタンスに渡し、あとは描画用のメソッドを呼び出すだけで実装も済んでしまうらしいです。
逆に言うとそれ以外のこと(頂点やインデックスの情報の作成・管理)は自分でやらなければならないということです。複雑なものはやはり既存のフレームワークに頼った方が安心で便利かもしれません。逆に出口が決まっているので、複数のフレームワークを併存させて、各々の得意分野の管理をしてもらうなんていう使い方もできるかもしれません。
できないこともまだいっぱいある
Flash好きの人は、ベクタ画像も好きな人も多いと思うので、ポリゴンっていう直線の塊に違和感を覚える人も多いかもしれません。私は「ポリゴン曲げたい」とか思っている口ですが、ポリゴンは曲げると割れちゃいますので、せいぜい細かく割って、曲線に近似させるしか方法がありません。ジオメトリシェーダが書けたらもっと幸せになれそうな気がします。
あとは物理演算エンジンもGPUの支援を受けられたら配置できるオブジェクトが随分増えるんじゃないでしょうか?AGALについては、今後もうちょっと使い道が増やせないか興味がつきないところです。