次の方法で共有


方法: ドメイン シェーダーを設計する

ドメイン シェーダーは、 テセレーションを実装するために連携する 3 つのステージの 3 番目です。 ドメイン シェーダーは、ハル シェーダーと UV 座標から変換されたコントロール ポイントからサーフェス ジオメトリを生成します。 このトピックでは、ドメイン シェーダーを設計する方法について説明します。

ドメイン シェーダーは、固定関数テセレータによって生成された各ポイントに対して 1 回呼び出されます。 入力はパッチ上のポイントの UV[W] 座標と、コントロール ポイントとパッチ定数を含むハル シェーダーからの出力データすべてです。 出力は、任意の方法で定義された頂点です。 出力がピクセル シェーダーに送信される場合、出力には位置 (SV_Position セマンティックで示される) が含まれている必要があります。

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

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

    [domain("quad")]
    

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

  2. ドメイン ロケーション システム値を使用して、ハル上の 場所 を宣言します。

    • クワッド パッチの場合は、float2 を使用します。
    • トライ パッチの場合は、float3 を使用します (barycentric 座標の場合)
    • 等値線の場合は、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

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

Direct3D 11 の使用方法

テセレーションの概要