方法 :ドメイン シェーダーの設計
ドメイン シェーダーは、テッセレーションを実装する 3 つのステージの 3 つ目です。ドメイン シェーダーは、ハル シェーダーで変換されたコントロール ポイントおよび UV 座標からサーフェス ジオメトリを生成します。
ドメイン シェーダーは、固定機能テッセレータによって生成されたポイントごとに 1 回呼び出されます。入力はパッチのポイントの UV[W] 座標、およびコントロール ポイントとパッチ定数を含む、ハル シェーダーのすべての出力データです。出力は、必要に応じて定義された頂点です。出力がピクセル シェーダーに送られる場合、その出力に位置 (SV_Position セマンティクスで示される) を含める必要があります。
ドメイン シェーダーを設計するには
ドメイン属性を定義します。
[domain("quad")]
ドメインは、クワッド パッチ用に定義されます。
ドメイン位置システム値を使用して、ハル上の位置を宣言します。
- クワッド パッチの場合、float2 を使用します。
- トライアングル パッチの場合、float3 (重心座標用) を使用します。
- 等値線の場合、float2 を使用します。
したがって、クワッド パッチ用のドメイン位置は、次のようになります。
float2 UV : SV_DomainLocation
その他の入力を定義します。
その他の入力はハル シェーダーから渡されます。これはユーザー定義です。ここには、パッチ用の入力コントロール ポイント (1 ~ 32 の範囲で指定する) と、入力パッチ定数データが含まれます。
コントロール ポイントはユーザー定義です。通常、次のような構造体を持ちます (「方法 :ハル シェーダーの設計」で定義する)。
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
パッチ定数データもユーザー定義です。次のようになります (「方法 :ハル シェーダーの設計」で定義する)。
HS_CONSTANT_DATA_OUTPUT input
ユーザー定義コードを追加して出力を計算します。これは、ドメイン シェーダーの主要部分を構成します。
この構造体には、ユーザー定義のドメイン シェーダー出力が含まれます。
struct DS_OUTPUT { float3 vNormal : NORMAL; float2 vUV : TEXCOORD; float3 vTangent : TANGENT; float3 vBiTangent : BITANGENT; float4 vPosition : SV_POSITION; };
この関数は、(テッセレータからの) 各入力 UV を取り、この位置のベジエ パッチを評価します。
[domain("quad")] DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch ) { DS_OUTPUT Output; // Insert code to compute the output here. return Output; }
この関数は、固定機能テッセレータによって生成されたポイントごとに 1 回呼び出されます。この例はクワッド パッチを使用するため、入力ドメイン位置 (SV_DomainLocation) は、float2 (UV) です。トライアングル パッチは、float3 入力位置 (UVW 重心座標) を持ち、等値線は、float2 入力ドメイン位置を持ちます。
この関数のその他の入力は、ハル シェーダーから直接渡されます。この例では、16 個のコントロール ポイントです。各コントロール ポイントは、BEZIER_CONTROL_POINT であるだけでなく、パッチ定数データ (HS_CONSTANT_DATA_OUTPUT) にもなります。出力は、必要とされる任意のデータを含む頂点です。この例では DS_OUTPUT です。
ドメイン シェーダーを設計したら、「方法 :ドメイン シェーダーの作成」を参照してください。