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については、今後もうちょっと使い道が増やせないか興味がつきないところです。
- Flash3D/シェーダーのおさらいNintendo3DSが発売されたり、液晶テレビから映像が飛び出す昨今ですが、3D描画プログラミングの歴史はそれほど短くありません。最初は2D画像を組み合わせてâ¦
- Flash3D/Flashと3DFlashテクノロジーのスタートは、「ベクタで記述された2Dオブジェクト」と「タイムライン」にあると思います。ただ今回扱うのは平面+時間という意味での3Dではなâ¦
- Flash3D/自分用のパッケージFlashで3D表現を行う場合、利用できるAPIはそこそこ低レベルですので、自由な実装ができる反面、やりたいことが簡単にはできないと思います。多くの人はやりたいâ¦
- Flash3D/操作の対象前回、Papervision3Dのファイル構成を展開して全体像を何となく掴んでみましたが、さて、その内のどこから詳しくみていけばこの一連の仕組みが理解できるでしâ¦
WPF/日記4昨日、うまくいかなかった部分について検討を加えて直してみました。画像を貼り付けたポリゴンがうまく表示されなかった原因は、貼り付けた画像のサイズが極端に大きかったâ¦- WPF/日記2当然、初学者の自分に必要なのは有能なテキストだと思い立ったので、参考になりそうなページを探してみました。 WPF アプリケーションを作る クッキングガイド これâ¦
- 開発日記/2011年の日記FlashのStage3Dを使おうと思って悩んだメモ。 いつの頃からかなんか思った位置にオブジェクトが配置されない Context3D.setProgramCoâ¦
WPF/日記11前回、Application.GetRemoteStreamを使用して、やっと自分のサイト(site of origin)に設置したXMLファイルを読み込むことâ¦- Flash3D/計算負荷を減らすレンダリングフロー で触れたとおり、Papervision3DではEvent.EnterFrameの発生の度にポリゴンの点をDisplayObjectに変換してâ¦
WPF/日記6昨日コード上から動的に追加されたはずの3Dモデル(アバタ)がなぜか画面に表示されなかった件について追跡調査を行ったところ、アバタのサイズが巨大すぎたため両足がカâ¦