細かい使い方まではわかりませんが、様々な用例から構造が少しずつ見えてきています。
プログラマブルなシェーダー Hull Shader と Domain Shader に挟まれた形で
Tessellator が入ります。
このテセレータというのは、位置的にも機能的にもラスタライザに非常に近いもの
なのかもしれません。
そう思えば固定機能であることも納得できます。
DomainShader はラスタライズ後に走る Pixsel Shader に相当し、規模も走る
スレッド数も動的に変化します。
テクスチャによってエフェクトが入る点も似ています。
DomainShader は Displacement Map を読み込むので、Pixsel Shader に次いで
テクスチャアクセスを多用するシェーダーとなりそうです。
そもそも、動的にサイズが変化するユニットだからこそイメージマップを利用する
意味があるわけで、必然というか当たり前のことなのかもしれません。
単一のパイプライン中に Tessellator と Rasterizer の 2ヶ所でデータの増幅が
行われます。本当は Geometry Shader でも可能なので 3ヶ所です。
逆にポリゴン減らすのは、生成後のプリミティブ単位で実行される Geometry Shader
でしか出来ないと思われます。
もしマップによってメッシュに穴を開けたいなら、GeometryShader でもテクスチャを
サンプリングするか、Domain Shader からパラメータを渡すことになるのでしょう。
ピクセルを減らすこと自体は PiselShader でも clip (discard) で可能です。
Vertex 単位で走る VertexShader や、Pixel 単位で走る PixelShader を考えると、
GeometryShader は PrimitiveShader といった方が理解しやすいかもしれません。
となると HullShader は PatchShader です。
DomainShader は Post Vertex Shader といった位置づけで、Tessellation 後の
VertexShader に相当します。
本来の VertexShader は Pre Vertex Shader。
VS Vertex Shader → Pre Vertex Shader HS Hull Shader → Patch Shader (Pre Primitive Shader) TS [[Tessellator]] DS Domain Shader → Post Vertex Shader GS Geometry Shader → Primitive Shader RS [[Rasterizer]] PS Pixel Shader
だいぶすっきりしました。
でも全部略称が PS になって区別できないからやっぱりだめです。
Tessellator や Displacement Map によって 3D データの作り方は今後変わっていく
と思われます。
3D だけでなく、ベクタフォントを GPU で直接描画するなど 2D 面でも応用できる
かもしれません。
関連エントリ
・Direct3D11 のパイプライン
・Direct3D11 Compute Shader など
・Gamefest2008 と Direct3D 11