イベント
[Gamefest 08#06]ついにテッセレーションを標準化,DirectX 11の新しい3Dレンダリングパイプライン
Direct3D 11の位置付け〜Direct3D 11はDirect3D 10.xのスーパーセットである
本稿では馴染みやすいキーワードとして「DirectX 11」を用いているが,正確には,今回話されたのはDirectXの中の3Dグラフィックスパイプラインを統括するDirect3Dのバージョン11「Direct3D 11」についてである。一般向けには今後もマイクロソフトやGPUベンダーも「DirectX 11」というキーワードを強調していくとは思うが,一応この点には留意してほしい。本稿では,記事中に提示するセッション内で示されたスライドが「Direct3D 11」として統一されていたのでこれに倣うことにする。
まず,Direct3D 11の位置付けについて理解しよう。Direct3D 11はDirect3D 9→Direct3D 10のときに行われた完全リニューアルデザインのものではなく,Direct3D 10,Direct3D 10.1のスーパーセットになる。つまりDirect3D 10.1の機能アップデート版という位置付けになる。
ここで筆者的に強調しておきたいのは「スーパーセット」という表現だ。
今世代のGPUで,NVIDIAは「Direct3D 10.1対応は見送る」姿勢を取ったことは本誌読者ならば知っている人も多いだろう。しかし,Direct3D 11がDirect3D 10.1のスーパーセットである以上,今後出てくると思われるNVIDIAのDirect3D 11世代のGPUは,Direct3D 10.1の機能をすべてサポートしてくるということになる。
別の視点から見ると,このことによりDirect3D 10.1相当の機能が死に絶えることはなくなったといえるわけで,今まで様子見だったPCゲーム開発スタジオも今後はDirect3D 10.1への対応を積極的に行っていくことが期待される。
基本的にDirect3D 11は,Direct3D 10からの置き換えになるので,Direct3D 10/Direct3D 10.1世代GPU搭載環境下でもインストールは可能だ。その際は,Direct3D 10/Direct3D 10.1相当のハードウェアアクセラレーションとDirect3D 11での新設APIなどが利用できる。しかし,この場合,後述する新シェーダの機能については利用できない。
そして,完成版の提供時期は2009年後期から2010年前期となる見込みで「まだ1年以上先」という認識で問題ない。Direct3D 11対応GPUの実物が登場するのもそのくらいになるはずだ。少なくとも,Windows Vista世代で提供されることが宣言され,また俗称「Windows 7」といわれている次期Windowsにも採用されることが決まっている。
なぜDirect3D 11が必要なのか
現在のリアルタイム3Dグラフィックスは高解像度が当たり前となり,これに伴って多ポリゴンでオブジェクトが表現されることが,もはや要求仕様になってきている。
現在(≒Direct3D 10.x以前)は,アーティストが3Dモデルをデザインするときは多ポリゴンで構築し,これをゲームエンジン(ランタイム)で利用するために,いくつかのレベルでポリゴン量を削減させた低ポリゴンモデルも同時に用意する。視点から近い大写しとなる状況用には多ポリゴンモデルを利用し,視点から遠くなるにつれて少ないポリゴン数の少ないポリゴンモデルに順次切り替えていくのが,近代的なゲームエンジンの典型であり,これをとくにLOD(Level of Detail)システムと呼ぶ。Direct3Dでもプログレッシブメッシュとして実装されている仕組みだ。
これにはいくつもの問題というか課題があった。
視覚的に問題となるのは低ポリゴン←→多ポリゴンの切換時にポンと形状が変化する瞬間が見えてしまうことがあるという点。この現象は「ポッピング」(POPPING)と呼ばれている。
そして一つの3Dキャラクタの表現に複数のLODモデルをGPU側に持たねばならず,これは捉え方によっては情報の冗長性があるということであり,無駄だといえる。
また,LODモデルの生成は自動でできなくもないが,前述のポッピングを緩和するためにアーティストが手作業で調整することが多く,オーサリング時の人的負荷が余計にかかるという問題がある。
そして実行時に目を向けてみると,キャラクターのポーズの変更(頂点アニメーション)を行う際には,スキニング処理が必要になるが,これを視点に近いときに用いる多ポリゴンで適用すると膨大な頂点処理負荷がかかることになる。剣を振る,走る,倒れる……といったアニメーションは,その仕込み単位/制御単位が内包ボーンベースであることがほとんどなので,多ポリゴンモデルでやる必然性は実はあまりないのだ。
そこで提案されるのがDirect3D 11の新しいレンダリングパイプラインのソリューションとなる。
Direct3D 11ではグラフィックスエンジンはこうなる
そこで,まずは,Direct3D 11のパイプラインの詳細解説の前に「Direct3D 11のレンダリングパイプラインではこう便利になる」という部分から解説しよう。
Direct3D 11世代では,ゲームエンジンは,一貫して低ポリゴンな基本形状モデルでアニメーション制御を行えばよくなる。これまでのように,視点からの距離によってLODレベルごとに3Dモデルを切り換えてアニメーションを適用しなくてよくなるのだ。
そしてその3Dモデルに適用する微細な凹凸やディテール部分についての形状は凹凸量を数値化したテクスチャ(ディスプレースメントマップ,あるいは変移マップと呼ばれる)を用意しておき,これをもとにして低ポリゴンの基本形状モデルに対して凹凸を適用する流れになる。
具体的には視点から近くて3Dモデル大写しになるときは,基本形状モデルを多ポリゴンモデルに自動変換して(テッセレートして),このディテールを的確に適用することで多ポリゴンモデルに仕上げるが,遠いときにはディテールの適用を大ざっぱに行う。この仕組みがGPU内のレンダリングパイプライン側で実行されるので,GPU側には低ポリゴンの基本形状モデルとディテール表現の凹凸テクスチャだけを転送しておけばよい。これまでのようにLODモデルを複数持っておく必要がないので冗長性が少ない。
さらに,無段階に低ポリゴンモデルから多ポリゴンモデルまでがレンダリング時にGPU側で生成されることになるのでポッピング現象も起こりえないのだ。
Direct3D 11で新設された三つのシェーダステージの詳細
Direct3D 11のパイプライン |
2007年に公開されたDirectX 11の仮想パイプライン |
図を見ると分かるように,Direct3D 10のパイプラインに対して新設されたのが「ハルシェーダ」(Hull Shader),「テッセレータ」(Tessellator),「ドメインシェーダ」(Domain Shader)の三つになる。このうちハルシェーダとドメインシェーダの二つがプログラマブルシェーダ,テッセレータが固定機能ユニット(固定機能シェーダ)となっている。
ハルシェーダのHULLとは「外殻」のこと。つまり3Dモデルの表皮をどういう形状にするかを決定するプログラマブルシェーダだ。
マイクロソフトが2007年に「仮説的なDirect3D 11パイプライン」として公開したブロックダイアグラム(下)の中に記載されている「Control Point Shader」がこのハルシェーダに相当する。
ハルシェーダの役割で最も基本となるのは「ポリゴンをどのくらい分割するか」の分割レベルの決定,分割手法の選定だ。
オブジェクトを,ベジエ曲面のような高次曲面で表現されているかのように分割して表現したい場合は,その制御点の算出もここハルシェーダで行う。
ハルシェーダはプログラマブルなので,ここに異方性/適応型の処理を埋め込むことも可能だ。例えば,そのキャラクターを特徴付ける部位に限っては,やや多ポリゴンに分割する……といった処理などだ。いわば適応型LODのロジックをハルシェーダで実行されるシェーダプログラムとして実装できるわけだ。
なお,ハルシェーダに入力されるのは,最大32頂点からなる「パッチ(PATCH)」と呼ばれるDirect3D 11で新設された新しいプリミティブタイプになる。例えば,あるポリゴンを分割しようとしたときに,ハルシェーダとして各種計算を行うのに,分割対象ポリゴンの周辺のポリゴンの形状や頂点座標までが必要になる場合があるので,それに対応させるための拡張概念になる。
このテッセレータは,ハルシェーダから受け渡された「ポリゴン分割計画」に従って,その仕様通りのポリゴン分割を行うものだ。とはいっても,この時点まででテッセレータが行ったのはポリゴンの実体的な分割というよりは,「パッチデータの拡張成形」という感じで,実体的な分割を完了するにはもう一段階の処理フェーズが必要となる。
具体的には,テッセレータが出力した仮想的に分割されたポリゴンの各頂点に対してちゃんと意味を持たせる工程を担当する。
ハルシェーダで算出した高次曲面用の制御点などはドメインシェーダに受け渡されるので,これをもとにドメインシェーダは,テッセレータで分割されたポリゴンをベジエ曲面となるように成形したりできる。あるいはディテールを記載したテクスチャ(ディスプレースメントマップ)を読み込んで分割されたポリゴンをへこましたり突き出したり……といったディスプレースメントマッピングの処理もここで行う。
Direct3D 11のテッセレーションの仕組みは今度こそ成功する?
ATI Radeon HD 2000/3000/4000シリーズのテッセレータも固定機能であった |
Xbox 360のテッセレーションの仕組みはDirect3D 11のものとよく似ている |
筆者の憶測ではあるが,今回のDirect3D 11のテッセレーションのパイプラインはXbox360 GPUのテッセレータ,ATI Radeon HD 2000/3000/4000シリーズのテッセレータの仕組みをベースにして標準化されたと思われる。
Xbox360 GPUのテッセレータ,ATI Radeon HD 2000/3000/4000シリーズのテッセレータは,両GPUがともにAMD製であったこともあって,ほぼ同一仕様の固定機能ロジックであった。Direct3D 9パイプラインと互換性を保ちつつ,テッセレータを実装しなければなかったために,Direct3D 9パイプラインの前段での実装となっていたのが特徴だった。このため,分割したポリゴンをちゃんとした意味を成すものに成形するのにEvaluation Shaderと呼ばれるロジック(Direct3D 11でいうところのドメインシェーダに相当)を頂点シェーダ側で実装する必要があった。
Direct3D 11パイプラインでは,このATIテッセレータ相当の仕組みを頂点シェーダの後段に「頂点パイプラインの一環」として組み入れた格好となっている。AMDテッセレータでは頂点シェーダにてソフトウェア実装させていたEvaluation Shaderロジックをドメインシェーダとして新プログラマブルシェーダ化(独立ブロック化)し,さらにプログラマブルなテッセレーションを実現するために固定機能シェーダであるテッセレータの前段にハルシェーダを据えた。おそらくこんな流れで設計されたのではないか。
松尾氏も,Direct3D 11のテッセレーションの仕組みがXbox360 GPUライクであることについて言及し,3Dゲームエンジンなどでテッセレーションの仕組みを効果的に利用したとしても,少々の改変だけでPCとXbox360の双方で動作できると思われる,と述べていた。
しかし,これまで高次曲面やテッセレーションの仕組みが何度となくGPUに実装されてきてもいまいち流行らなかったことを思い返し,不安に駆られている人も少なからずいるだろう。
いわれてみれば,ATI Radeon 8500のN-PATCH,Parhelia-512のディスプレースメントマッピングエンジン,GeForce3〜4のHigher Order Surface機能など,「結果的になかったことになっている」曲面表現関連機能の数々が思い起こされる。
しかし,これらはいずれも各GPUの独自機能として実装されたものであり,たとえDirect3Dでサポートされていたとしても,ほかのGPUは,必ずしもDirectXのすべての機能をサポートする必要はないとされていたのだ(※DirectX 9以前)。
今回はプログラマブルシェーダのパイプラインとしてDirectX 11の標準仕様に組み込まれ,DirectX 10以降では,各GPUは仕様に定義された機能をフルサポートすることが要求されるので,テッセレーションは,今度こそメジャーに活用されることになるはずだ。
Direct3D 11時代におけるゲームエンジンなどの頂点パイプラインの一例 |
Direct3D 11のPCゲームタイトルとXbox360ゲームタイトルの双方でテッセレーションを活用することが可能に!? |
- 関連タイトル:
DirectX
- この記事のURL: