飴屋

Flash3D/シェーダーのおさらい

3DCGの歴史みたいなもの

Nintendo3DSが発売されたり、液晶テレビから映像が飛び出す昨今ですが、3D描画プログラミングの歴史はそれほど短くありません。最初は2D画像を組み合わせて擬似的に3D表現を行うところから始まり、より柔軟に視点を変えられるようにポリゴンによる造形がなされるようになり、質量や太陽光線を忠実にシュミレーションするようなプログラムまで開発されています。私が初めて触れた3Dプログラミングは雑誌に投稿されていたポリゴンのようなものをN88-BASIC上で描画するというものでした。まだ、幼かったので、内容は理解できていませんでしたが、雑誌のソースをそのまま打ち込んで実行してみたものです。しかし、出力結果はとてもアニメーションとはいえないようなもので、描画スピードの遅さが目立ちました。(それでもワクワクしてました。)紙面には「3Dはまだ重い」といったような評価と「しかし将来は・・・」という展望が載っていました。

そんなこともあってか3Dエンジンには、ハード的な性能とソフト的な工夫が求められているというのが、頭に印象付けられました。おそらくインターネットと同様に、3DCG技術は軍需産業の需要からスタートしたんじゃないかと思います。ロケットとかミサイルとか戦闘機の操縦とか、空間的なシュミレーションが必要そうです。お金もたくさんありそうだし、ハード面ではさぞかし充実していたことでしょう。ハードの性能を最大限高めるべく、ソフトウェアの競争も各国間でしのぎを削っていたと想像されます。今も流体力学的なシュミレーション分野は車や飛行機の開発に役立っていることでしょう。

ある程度の技術的な洗練を経て、やっと3D技術がエンターテイメントの世界に降りてきます。日本国内だとゲームで、アメリカだと映画ですね。なにしろ3DCGは計算コストが高いので、まずフィルムに出力すればいいだけの映画の世界で次々に新しい映像表現が生まれてきます。今では陳腐にうつるかもしれませんが、ターミネーター2なんて当時はみんな驚いたものでした。マシンを大量に並列につないで、何カ月もかけて演算するなんてことを耳にして、なんか未来きたなって思ってましたっけ。今や同じことが家庭用パソコンであっという間にできるなんて・・・人間ってすごい。

PCやコンシューマゲーム機でも、徐々に3DCGを扱う場面が増えてくると、OpenGLやDirectXといったフレームワークの整備が進んできました。いろいろ他にもあったような気がしますが、グラフィックボードを作るハードウェアメーカーのサポートが受けられるかどうかで盛衰が決定するわけですね。現状ではこのフレームワークに乗っかっておけば、ほぼ間違いないでしょうね。そう考えると、Flash Playerが3D描画に対応するのは遅かったんじゃないかという気もしますが、これらのフレームワークもバージョンが増すごとに大きな改変の歴史を伴っていますので、それらが落ち着いてきて、一定の方向性が見出されてきている今だからこそ、なのかもしれません。

3DCGの用途

3DCGの用途を大別するなら、表現の美しさを追求する系と描画のスピードを追求する系とにわかれるかもしれません。

前者は映画のように時間をかけてレンダリングした結果を記録しておいて上映するような用途に向いています。レイトレーシング手法のような光源から進行する光線の軌跡をを一つ一つトレースしていって、写実的な絵作りをすることもできますし、計算手法に手を加えて、絵画的な表現やセルアニメのような表現を試みる例もあります。

後者はリアルタイムに変化していく物体の形状を遅滞なくユーザに伝達しなくてはならないゲームのような表現に用いられます。その場その場で計算し続けなくてはならないので、FPS(秒間コマ数)を稼ぐためにいろいろなものを犠牲にすることが多いですが、ユーザに自由な視点を提供でき、臨場感ある表現が可能になります。

これらもまた技術の進化によって、徐々にきれいで早い描画が得られるようになってきましたが、新しい表現方法もまた次々に編み出されているため、第一線で活躍している人たちは常に計算コストの見積もりと戦わなければならないようです。

シェーダーってなんだっけ?

3DCGの技術的な成熟とともに、作業工程やプログラムの内容にはほぼ定番ができあがってきました。シェーダーというのはそんな中で、入力にモデルデータを、出力にレンダリング結果をもつ工程のことですね。モデルデータの中には頂点の位置情報や色情報、頂点のつなぎ方の情報やテクスチャの座標位置情報なんかが入っていますので、その情報を元に3次元データを2次元データに射影するのがそのお仕事です。

シェーダーは処理の高速化にとても関連性の高い部分ですので、ハードウェアからの制約を受けやすい部分です。GPUがパフォーマンスを発揮できる理由は、単純なデータを淡々と処理し続けるだけだからですので、シェーダーをハードウェアに頼るためには、シェーダーの内容をプログラマの手から離す必要がありました。しかし、近年、プログラマブルシェーダーという技術が台頭してきて、シェーダーの中身を再びプログラマが記述できるようになってきました。そのために、シェーダーが行う各工程を細かく分けて、部分的にプログラム可能な余地が作出されました。

現在、主なプログラマブルシェーダーは、工程順に

  • バーテックスシェーダー
  • ジオメトリシェーダー
  • フラグメントシェーダー

という3つの工程部分が挙げられるようです。

バーテックスシェーダーは、頂点情報を加工する部分です。人体のモデルがあったとして、右半身だけ頂点色を青くするとか、上半身だけ頂点座標を変えてツイストさせるとか、そんなプログラムが書けます。

ジオメトリシェーダーは頂点を増減させる部分です。遠くの物体の頂点数を減らして計算量を減らしたり、体表にポリゴンを追加して毛を生やしたりできそうです。

フラグメントシェーダーは2Dに射影された後に、各ピクセル情報を加工する部分です。テクスチャ座標を元にテクスチャを張ったり、エフェクトをかけたり最終的な見栄えに大きく影響を与える部分です。

Flashの3D APIがサポートするのはバーテックスシェーダーとフラグメントシェーダーの二つだそうです。ジオメトリシェーダーは比較的若い技術ですし、ハードウェアのサポート状況との兼ね合いなどもあるのかもしれません。

ポリゴンの重なりがある場合に、手前のポリゴンだけ描画する深度テストや、特定の領域のみ描画するステンシルテストのような工程もありますが、その辺はブレンドモードやアクションを定数で指定してある程度内容を制御できるようですね。

シェーダー(shader)というのはその名の通り、影を描画してそこから立体感を取得する作業だと思います。特にフラグメントシェーダーあたりを使って面白い効果を画面にもたせるのが流行るんじゃないかと思います。私はバーテックスシェーダーで頂点座標をグニャグニャ動かすのも楽しそうだと思ってます。

また、サードパーティー製の3Dエンジンがどのくらいプログラマブルシェーダーで楽しいことを盛り込んでくるのか興味深いところです。簡単に鏡面処理や、ドロップシャドウが書けるような実装も入ってくるのでしょうか。

Date: 2011/6/15

Flash3D