方法: ドメイン シェーダーを設計する
ドメイン シェーダーは、 テセレーションを実装するために連携する 3 つのステージの 3 番目です。 ドメイン シェーダーは、ハル シェーダーと UV 座標から変換されたコントロール ポイントからサーフェス ジオメトリを生成します。 このトピックでは、ドメイン シェーダーを設計する方法について説明します。
ドメイン シェーダーは、固定関数テセレータによって生成された各ポイントに対して 1 回呼び出されます。 入力はパッチ上のポイントの UV[W] 座標と、コントロール ポイントとパッチ定数を含むハル シェーダーからの出力データすべてです。 出力は、任意の方法で定義された頂点です。 出力がピクセル シェーダーに送信される場合、出力には位置 (SV_Position セマンティックで示される) が含まれている必要があります。
ドメイン シェーダーを設計するには
ドメイン属性を定義します。
[domain("quad")]
ドメインは、クワッド パッチ用に定義されています。
ドメイン ロケーション システム値を使用して、ハル上の 場所 を宣言します。
- クワッド パッチの場合は、float2 を使用します。
- トライ パッチの場合は、float3 を使用します (barycentric 座標の場合)
- 等値線の場合は、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 。
ドメイン シェーダーを設計した後、「 方法: ドメイン シェーダーを作成する」を参照してください。
関連トピック