日別アーカイブ: 2008年9月20日

Direct3D11 のパイプライン

今日も Gamefest2008 の資料を参考に、D3D11 関連をいろいろ見てみます。
Gamefest 2008 Presentations

D3D11 ではテセレータと共に新しくシェーダーステージが追加されています。
Direct3D 11 の目玉機能の一つです。

新しく Patch プリミティブが導入されるようです。
Quad で指定可能で、かつ隣接する頂点情報を入力できます。

D3D10 GeometryShader の Triangle Adjacency に少々似てますが、
Triangle Adj は最大6頂点まででした。

Patch は最大 32 頂点まで入力できるようです。
たとえば単純で均等な Quad mesh なら、それぞれの隣接 Quad を1つ受け取ると
12頂点です。
これをコントロールポイントとして使います。

GeometryShader ではプリミティブ毎に 1つのシェーダーが走る形式でした。
HullShader は周囲の頂点情報を受け取りつつも、各入力頂点 (ControlPoint)
毎にシェーダー (Thread) を走らせることが可能となるようです。

頂点シェーダーと違うのは、それぞれのシェーダーが同じパッチ内のすべての
コントロールポイントにアクセス出来るということ。

また HullShader は、GS のようにパッチ毎に 1つだけ走らせることもできそうです。
おそらく、パッチ単位で走る HullShader 関数と、コントロールポイント毎に
走る HullShader 関数の両方を指定出来るのではないかと思われます。

HullShader はテセレータの前段階です。
テセレータの後に位置するのが DomainShader と呼ばれます。

DomainShader はテセレータで生成された頂点毎にシェーダーが走るようです。
この場合もパッチ単位で、入力されたコントロールポイントすべての情報を
受け取ることができます。

このように細切れで ShaderStage が増えているのは、入出力情報のグループ化に
よるものでしょうか。

とりあえずまとめてみました

VertexShader   頂点毎に走る。  入力情報はその1頂点のみ。
HullShader     パッチ毎。      パッチのコントロールポイントを全部参照できる。
HullShader     コントロールポイント毎。パッチのコントロールポイントを全部参照できる。
DomainShader   生成された頂点毎。 パッチの入力コントロールポイントを全部参照できる。
GeometryShader 生成されたプリミティブ毎 。プリミティブを構成する頂点を全部参照できる。
  テセレータがプリミティブとして Adjacency を生成できるかどうかは不明。
PixelShader    ラスタライズされたピクセル毎。GS or VS 出力から補間された値が入力となる。

関連エントリ
Direct3D11 Compute Shader など
Gamefest2008 と Direct3D 11