方法 :ドメイン シェーダーの設計

ドメイン シェーダーは、テッセレーションを実装する 3 つのステージの 3 つ目です。ドメイン シェーダーは、ハル シェーダーで変換されたコントロール ポイントおよび UV 座標からサーフェス ジオメトリを生成します。

ドメイン シェーダーは、固定機能テッセレータによって生成されたポイントごとに 1 回呼び出されます。入力はパッチのポイントの UV[W] 座標、およびコントロール ポイントとパッチ定数を含む、ハル シェーダーのすべての出力データです。出力は、必要に応じて定義された頂点です。出力がピクセル シェーダーに送られる場合、その出力に位置 (SV_Position セマンティクスで示される) を含める必要があります。

ドメイン シェーダーを設計するには

  1. ドメイン属性を定義します。

     [domain("quad")] 
    

    ドメインは、クワッド パッチ用に定義されます。

  2. ドメイン位置システム値を使用して、ハル上の位置を宣言します。

    • クワッド パッチの場合、float2 を使用します。
    • トライアングル パッチの場合、float3 (重心座標用) を使用します。
    • 等値線の場合、float2 を使用します。

    したがって、クワッド パッチ用のドメイン位置は、次のようになります。

     float2 UV : SV_DomainLocation 
    
  3. その他の入力を定義します。

    その他の入力はハル シェーダーから渡されます。これはユーザー定義です。ここには、パッチ用の入力コントロール ポイント (1 ~ 32 の範囲で指定する) と、入力パッチ定数データが含まれます。

    コントロール ポイントはユーザー定義です。通常、次のような構造体を持ちます (「方法 :ハル シェーダーの設計」で定義する)。

     const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch 
    

    パッチ定数データもユーザー定義です。次のようになります (「方法 :ハル シェーダーの設計」で定義する)。

     HS_CONSTANT_DATA_OUTPUT input 
    
  4. ユーザー定義コードを追加して出力を計算します。これは、ドメイン シェーダーの主要部分を構成します。

    この構造体には、ユーザー定義のドメイン シェーダー出力が含まれます。

     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 です。

ドメイン シェーダーを設計したら、「方法 :ドメイン シェーダーの作成」を参照してください。

関連項目

テッセレーションの概要