方法 :ハル シェーダーの設計

ハル シェーダーは、テッセレーションの実装を構成する 3 つのステージの 1 つ目です (他の 2 つのステージは テッセレータおよびドメイン シェーダーです)。

ハル シェーダーには、メイン ハル シェーダーおよびパッチ定数関数という 2 つの関数が必要です。ハル シェーダーは、計算を各コントロール ポイントに実装します。また、ハル シェーダーは、計算を各パッチに実装するパッチ定数関数も呼び出します。

ハル シェーダーを設計したら、ハル シェーダーを作成する方法を示します。「方法 :ハル シェーダーの作成」を参照してください。

ハル シェーダーを設計するには

  1. ハル シェーダーの入力コントロール ポイントおよび出力コントロール ポイントを定義します。

     // Input control point struct VS_CONTROL_POINT_OUTPUT {     float3 vPosition : WORLDPOS;     float2 vUV       : TEXCOORD0;     float3 vTangent  : TANGENT; };  // Output control point struct BEZIER_CONTROL_POINT {     float3 vPosition  : BEZIERPOS; }; 
    
  2. 出力パッチ定数データを定義します。

     // Output patch constant data. struct HS_CONSTANT_DATA_OUTPUT {     float Edges[4]        : SV_TessFactor;     float Inside[2]       : SV_InsideTessFactor;          float3 vTangent[4]    : TANGENT;     float2 vUV[4]         : TEXCOORD;     float3 vTanUCorner[4] : TANUCORNER;     float3 vTanVCorner[4] : TANVCORNER;     float4 vCWts          : TANWEIGHTS; }; 
    

    クワッド ドメインの場合、固定機能テッセレータがテッセレーションの度合いを認識する必要があるため、SV_TessFactor が 4 エッジ テッセレーション係数 (エッジのテッセレーション用に) を定義します。必要な出力は、トライアングル ドメインと等値線ドメインで異なります。

    固定機能テッセレータは、他のハル シェーダー出力 (他のパッチ定数データや任意のコントロール ポイントなど) を参照しません。ドメイン シェーダーは (固定機能テッセレータが生成する各ポイント用に呼び出される)、ハル シェーダーのすべての出力コントロール ポイントおよびすべての出力パッチ定数データをドメイン シェーダーの入力とみなし、その場所でパッチを制御します。

  3. パッチ定数関数を定義します。パッチ定数関数は、パッチごとに 1 回実行され、パッチ全体に対して一定である任意のデータを計算します (ハル シェーダーで計算されるコントロールごとのポイント データとは異なる)。

      #define MAX_POINTS 32  // Patch Constant Function HS_CONSTANT_DATA_OUTPUT SubDToBezierConstantsHS(      InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,     uint PatchID : SV_PrimitiveID ) {        HS_CONSTANT_DATA_OUTPUT Output;      // Insert code to compute Output here          return Output; } 
    

    パッチ定数関数のプロパティは次のとおりです。

    • 1 つの入力は、パッチ ID を含む変数を指定し、SV_PrimitiveID システム値によって識別されます (シェーダー モデル 4 の 「semantics」を参照)。
    • 入力パラメーターの 1 つは、入力コントロール ポイントになります。この例では、VS_CONTROL_POINT_OUTPUT で宣言されます。パッチ関数は、各パッチのすべての入力コントロール ポイントを参照できます。この例では、パッチごとに 32 個のコントロール ポイントがあります。
    • パッチ関数では、少なくともパッチごとに SV_TessFactor で識別されたテッセレータ ステージのテッセレーション係数を計算する必要があります。クワッド ドメインでは、エッジ用の 4 つのテッセレーション係数およびパッチの内部をテッセレーションするための 2 つの追加の係数 (SV_InsideTessFactor で識別) が必要です。固定機能テッセレータは、他のハル シェーダー出力 (パッチ定数データや任意のコントロール ポイントなど) を参照しません。
    • 出力は通常、構造体によって定義されており、この例では HS_CONSTANT_DATA_OUTPUT によって識別されます。この構造体は、ドメイン タイプに依存しており、トライアングル ドメインまたは等値線ドメインによって異なります。

    一方、ドメイン シェーダーは、固定機能テッセレータが生成する各ポイント用に呼び出され、出力コントロール ポイントおよび出力パッチ定数データ (両方ともハル シェーダーから渡される) を参照し、その場所でパッチを評価します。

  4. ハル シェーダーを定義します。ハル シェーダーは、パッチのプロパティ (パッチ定数関数を含む) を識別します。ハル シェーダーは、出力コントロール ポイントごとに 1 回呼び出されます。

     [domain("quad")] [partitioning("integer")] [outputtopology("triangle_cw")] [outputcontrolpoints(16)] [patchconstantfunc("SubDToBezierConstantsHS")] BEZIER_CONTROL_POINT SubDToBezierHS(      InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,      uint i : SV_OutputControlPointID,     uint PatchID : SV_PrimitiveID ) {     VS_CONTROL_POINT_OUTPUT Output;      // Insert code to compute Output here.          return Output; } 
    

    ハル シェーダーは次の属性を使用します。

すべての入力コントロール ポイント (VS_CONTROL_POINT_OUTPUT により識別される) は、ハル シェーダーが呼び出されるたびに表示されます。この例では、32 個の入力コントロール ポイントがあります。

すべてのハル シェーダー は、各パッチで (SV_PrimitiveID により識別される) 出力コントロール ポイントごとに (SV_OutputControlPointID により識別される) 1 回呼び出されます。この特定のシェーダーの目的は、ベジエ コントロール ポイントとして定義された出力 i を計算することです (この例には、outputcontrolpoints によって定義される 16 個の出力コントロール ポイントがある)。

ハル シェーダーは、パッチ (パッチ定数関数) ごとに 1 回ルーチンを実行し、パッチ定数データ (少なくともテッセレーション係数) を計算します。ハル シェーダーは、パッチ定数関数 (SubDToBezierConstantsHS と呼ばれる) を各パッチで別々に実行し、テッセレータ ステージのテッセレーション係数などのパッチ定数データを計算します。

関連項目

テッセレーションの概要