Direct3D 11の各シェーダはこう動く!
Direct3D 11世代のGPUのレンダリングパイプラインを順番に見ていこう。
Direct3D 10世代からある頂点アセンブラ(Input Assembler)は、頂点を集めて後段のジオメトリレベルのシェーダに受け渡す役割を果たす。
Direct3D 11世代の頂点アセンブラでは、後段のテッセレーションを行う場合に限っては、新しいプリミティブ形式である「パッチ」の入力にのみ対応する。
「パッチ」(PATCH)とは、処理対象のポリゴンとそれに隣接するポリゴンまでを含んだ面のことで、Direct3D 11仕様では最大で32頂点からなるものに限定される。
Direct3D 11のInput Assembler(頂点アセンブラ)はDirect3D 11で新設された新しいプリミティブ形式「パッチ」の入力に対応する |
「パッチ」の例。処理対象は中央の四角形だが、後段のテッセレーションの都合上隣接するポリゴンも入力される |
頂点シェーダ(VERTEX SHADER)はもちろんDirect3D 11世代にも当然ある。ここでは従来通り、頂点を変移させたり、座標系の変換処理などを行う。
ハル・シェーダは後段のテッセレーションを行う際の基点を生成するシェーダになる。GDC 2007で公開されたDirectX 11パイプライン想像図におけるControl Point Shaderは、ずばり、このハル・シェーダそのものになる。
たとえば始点からの距離に応じてテッセレーションレベルを変化させてみたり、視線からみてエッジとなる部分や、その3Dキャラクタの特徴を決定づける重要な部分についてはテッセレーションレベルを上げる、重要でない部分は下げる、あるいはテクスチャやユーザー定義のなんらかの関数に応じてテッセレーションレベルを変更する……といったプログラマブルなテッセレーションレベルの決定をハル・シェーダは行うことになる。
テッセレータは前述したように固定機能ユニットであり、ハル・シェーダによって生成されたパラメータを元に、ポリゴンの分割(サブディビジョン)を実践する。
テッセレータは固定機能ではあるが与えられたパラメータに応じてポリゴン分割が行える仕様にはなっているため「コンフィギュラブル」(Configurable)であるとNVIDIAも説明している。
ポリゴンを分割する……というと、とても高度な工程に思えてしまうが、実際の作業自体はハル・シェーダによって与えられた基点をベースに、パッチに対して頂点データを差し込んで出力するだけの役割を果たす。
ということは、おそらく、機能としてはATIのRadeon HD 2000シリーズ以降(およびXbox 360 GPU)に搭載されたテッセレータユニットは、このDirect3D 11のテッセレータのあり方に近いと推察される。
ドメイン・シェーダはテッセレータから出力でてきた分割されたパッチの各頂点をプログラマブルに変移させる処理を行う。
たとえば高次曲面に沿うように各頂点を変移させたり、テクスチャに記載されているハイトマップ(凹凸マップ)に従って各頂点を出っ張らせたりへこませたりする処理を行う。
Radeon HD 2000シリーズ以降に搭載されたテッセレータの仕組みでも、テッセレータ自体の出力は、ただポリゴンが増加しただけの状態であり、分割後の頂点に対しての変移処理が必要であった。Radeon HD 2000シリーズ以降では、この役割を頂点シェーダが担当していた。ATI(AMD)ではこの仕組みをEvaluation Shaderと独自に呼んでいたが、Direct3D 11ではドメイン・シェーダというオフィシャルな名前が与えられた格好になる。