次の方法で共有


テッセレーション ステージ

Direct3D 11 ランタイムでは、テッセレーションを実装する 3 つの新しいステージがサポートされています。このステージは、GPU 上の詳細度の低いサブ区分サーフェスをより詳細なプリミティブに変換します。 高次サーフェスをレンダリングに適した構造にテセレーション タイル (または分割) します。

ハードウェアにテッセレーションを実装することで、グラフィックス パイプラインでは、より詳細なモデル (多角形の数が少ない) を評価し、より詳細にレンダリングできます。 ソフトウェア テッセレーションは実行できますが、ハードウェアによって実装されたテッセレーションでは、モデル サイズに視覚的な詳細を追加したり、リフレッシュ レートを麻痺したりすることなく、驚くべき量の視覚的な詳細 (ディスプレイスメント マッピングのサポートを含む) を生成できます。

テッセレーションの利点

テセレーション:

  • メモリと帯域幅を大量に節約します。これにより、アプリケーションは低解像度モデルからより詳細なサーフェスをレンダリングできます。 Direct3D 11 パイプラインで実装されるテッセレーション手法では、ディスプレイスメント マッピングもサポートされており、サーフェスの詳細を大量に生成できます。
  • 継続的またはビュー依存の詳細レベルなど、スケーラブルなレンダリング手法をサポートし、その場で計算できます。
  • より低い頻度で高価な計算を実行することでパフォーマンスを向上させます (詳細度の低いモデルで計算を行います)。 これには、衝突検出やソフトボディダイナミクスのための現実的なアニメーションや物理計算のためのブレンドシェイプまたはモーフターゲットを使用したブレンド計算が含まれる場合があります。

Direct3D 11 パイプラインはハードウェアにテッセレーションを実装し、CPU から GPU に作業をオフロードします。 これにより、アプリケーションで多数のモーフ ターゲットや、より高度なスキニング/デフォメーション モデルが実装されている場合、パフォーマンスが大幅に向上する可能性があります。 新しいテッセレーション機能にアクセスするには、いくつかの新しいパイプライン ステージについて学習する必要があります。

新しいパイプライン ステージ

テッセレーションでは、GPU を使用して、クワッド パッチ、三角形パッチ、または等線から構築されたサーフェスから、より詳細なサーフェスを計算します。 高い順序のサーフェスを近似するために、各パッチはテッセレーション 係数を使用して三角形、点、または線に分割されます。 Direct3D 11 パイプラインは、次の 3 つの新しいパイプライン ステージを使用してテッセレーションを実装します。

  • Hull-Shader ステージ - 各入力パッチ (クワッド、三角形、または線) に対応するジオメトリ パッチ (およびパッチ定数) を生成するプログラミング可能なシェーダー ステージ。
  • テッセレータ ステージ - ジオメトリ パッチを表し、これらのサンプルを接続する一連の小さなオブジェクト (三角形、点、または線) を生成するドメインのサンプリング パターンを作成する固定関数パイプライン ステージ。
  • Domain-Shader ステージ - 各ドメイン サンプルに対応する頂点の位置を計算するプログラミング可能なシェーダー ステージ。

次の図は、Direct3D 11 パイプラインの新しいステージを示しています。

ハル シェーダー、テッセレータ、ドメイン シェーダーの各ステージを強調表示する direct3d 11 パイプラインの図

次の図は、テッセレーション ステージの進行を示しています。 進行状況は、詳細度の低いサブ区分サーフェスから始まります。 次の進行状況では、入力パッチと、これらのサンプルを接続する対応するジオメトリ パッチ、ドメイン サンプル、および三角形が強調表示されます。 これらのサンプルに対応する頂点が最終的に強調表示されます。

テッセレーションの進行図

Hull-Shader ステージ

ハル シェーダー (パッチごとに 1 回呼び出されます) は、低次サーフェスを定義する入力コントロール ポイントを、パッチを構成するコントロール ポイントに変換します。 また、テッセレーション ステージとドメイン ステージのデータを提供するために、パッチごとの計算も行います。 最も単純なブラック ボックス レベルでは、ハル シェーダー ステージは次の図のようになります。

ハル シェーダー ステージ図

ハル シェーダーは HLSL 関数を使用して実装され、次のプロパティを持っています。

  • シェーダー入力は 1 から 32 のコントロール ポイントの間です。
  • シェーダーの出力は、テッセレーション 係数の数に関係なく、1 から 32 のコントロール ポイントの間にあります。 ハル シェーダーから出力されるコントロール ポイントは、ドメイン シェーダー ステージで使用できます。 パッチ定数データはドメイン シェーダーで使用できます。テセレーション 係数は、ドメイン シェーダーとテセレーション ステージで使用できます。
  • テッセレーション 係数によって、各パッチを分割する量が決まります。
  • シェーダーは、テッセレータ ステージで必要な状態を宣言します。 これには、コントロール ポイントの数、パッチ面の種類、テッセレーション時に使用するパーティション分割の種類などの情報が含まれます。 この情報は、通常、シェーダー コードの先頭に宣言として表示されます。
  • ハル シェーダー ステージでエッジ テッセレーション係数を = 0 または NaN に設定すると、パッチがカリングされます。 その結果、テッセレータ ステージは実行される場合と実行されない場合があり、ドメイン シェーダーは実行されず、そのパッチに対して可視出力は生成されません。

より深いレベルでは、ハル シェーダーは実際にはコントロール ポイント フェーズとパッチ定数フェーズの 2 つのフェーズで動作します。これはハードウェアによって並列に実行されます。 HLSL コンパイラは、ハル シェーダーで並列処理を抽出し、ハードウェアを駆動するバイトコードにエンコードします。

  • コントロール ポイント フェーズは、各コントロール ポイントに対して 1 回動作し、パッチのコントロール ポイントを読み取り、1 つの出力制御ポイント (ControlPointID で識別) を生成します。
  • パッチ定数フェーズはパッチごとに 1 回動作し、エッジ テッセレーション 係数やその他のパッチごとの定数を生成します。 内部的には、多くのパッチ定数フェーズが同時に実行される場合があります。 パッチ定数フェーズでは、すべての入力および出力制御ポイントへの読み取り専用アクセスが可能です。

ハル シェーダーの例を次に示します。

[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
     InputPatch<MyInPoint, 12> InPts)
{
     MyOutPoint result;
     
     ...
     
     result = TransformControlPoint( InPts[Id] );

     return result;
}

ハル シェーダーを作成する例については、「方法: ハル シェーダーを作成する」を参照してください。

テッセレータ ステージ

テッセレータは、ハル シェーダーをパイプラインにバインドすることによって初期化される固定関数ステージです (「方法: テッセレータ ステージ を初期化する」参照)。 テッセレータ ステージの目的は、ドメイン (クワッド、トライ、またはライン) を多数の小さなオブジェクト (三角形、ポイント、または線) に分割することです。 テッセレータは、正規化された (0 対 1) 座標系の正規ドメインをタイル化します。 たとえば、クワッド ドメインは単位の正方形にテッセレーションされます。

テッセレータは、パッチごとに 1 回、ハル シェーダー ステージから渡されるテッセレーション 係数 (ドメインをテッセレーションする方法を指定) とパーティション分割の種類 (パッチのスライスに使用するアルゴリズムを指定します) を使用して動作します。 テッセレータは uv (および必要に応じて w) 座標とサーフェス トポロジをドメイン シェーダー ステージに出力します。

内部的には、テッセレータは次の 2 つのフェーズで動作します。

  • 第 1 フェーズでは、32 ビット浮動小数点演算を使用して、テッセレーション係数を処理し、丸め問題を修正し、非常に小さな因子を処理し、係数を削減および結合します。
  • 2 番目のフェーズでは、選択したパーティション分割の種類に基づいてポイントまたはトポロジ リストが生成されます。 これはテッセレータ ステージのコア タスクであり、固定小数点演算で 16 ビット分数を使用します。 固定小数点演算を使用すると、許容可能な精度を維持しながらハードウェアアクセラレーションが可能になります。 たとえば、幅 64 メートルのパッチを適用すると、この精度により、2 mm の解像度でポイントを配置できます。
パーティション分割の種類 範囲
fractional_odd [1...63]
fractional_even TessFactor 範囲: [2..64]
整数 TessFactor 範囲: [1..64]
pow2 TessFactor 範囲: [1..64]

Domain-Shader ステージ

ドメイン シェーダーは、出力パッチ内の再分割されたポイントの頂点位置を計算します。 次の図に示すように、ドメイン シェーダーはテッセレータ ステージ出力ポイントごとに 1 回実行され、テッセレータ ステージ出力 UV 座標、ハル シェーダー出力パッチ、ハル シェーダー出力パッチ定数への読み取り専用アクセス権を持っています。

ドメイン シェーダー ステージ図

ドメイン シェーダーのプロパティは次のとおりです。

  • ドメイン シェーダーは、テッセレータ ステージからの出力座標ごとに 1 回呼び出されます。
  • ドメイン シェーダーは、ハル シェーダー ステージからの出力コントロール ポイントを使用します。
  • ドメイン シェーダーは、頂点の位置を出力します。
  • 入力は、コントロール ポイント、パッチ定数データ、テッセレーション 係数を含むハル シェーダー出力です。 テッセレーション係数には、固定関数テッセレータで使用される値と、たとえば、ジオモーフィングを容易にする生の値 (整数テッセレーションによる丸め前など) を含めることができます。

ドメイン シェーダーが完了すると、テッセレーションが完了し、パイプライン データは次のパイプライン ステージ (ジオメトリ シェーダー、ピクセル シェーダーなど) に進みます。 隣接性を持つプリミティブ (三角形あたり 6 個の頂点など) を受け取るジオメトリ シェーダーは、テッセレーションがアクティブな場合は無効です (これにより、デバッグ レイヤーが不平を言う未定義の動作になります)。

ドメイン シェーダーの例を次に示します。

void main( out    MyDSOutput result, 
           float2 myInputUV : SV_DomainPoint, 
           MyDSInput DSInputs,
           OutputPatch<MyOutPoint, 12> ControlPts, 
           MyTessFactors tessFactors)
{
     ...

     result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}

テッセレーション ステージを初期化するための API

テッセレーションは、ハル シェーダーとドメイン シェーダーという 2 つの新しいプログラミング可能なシェーダー ステージで実装されます。 これらの新しいシェーダー ステージは、シェーダー モデル 5 で定義されている HLSL コードでプログラミングされます。 新しいシェーダー ターゲットは、hs_5_0とds_5_0です。 すべてのプログラミング可能なシェーダー ステージと同様に、DSSetShader や HSSetShaderなどの API を使用してシェーダーがパイプラインにバインドされるときに、ランタイムに渡されるコンパイル済みシェーダーからハードウェアのコード抽出されます。 ただし、最初に、CreateHullShaderや CreateDomainShaderなどの API を使用してシェーダーを作成する必要があります。

ハル シェーダーを作成し、それをハル シェーダー ステージにバインドすることで、テッセレーションを有効にします (これにより、テッセレータ ステージが自動的に設定されます)。 テッセレーションされたパッチから最終的な頂点位置を生成するには、ドメイン シェーダーを作成してドメイン シェーダー ステージにバインドする必要もあります。 テッセレーションが有効になったら、input-assembler ステージへのデータ入力はパッチ データである必要があります。 つまり、入力アセンブラー トポロジは、IASetPrimitiveTopologyを使用 D3D11_PRIMITIVE_TOPOLOGY セットからのパッチ定数トポロジである必要があります。

テッセレーションを無効にするには、ハル シェーダーとドメイン シェーダーを NULL 設定します。 geometry-shader ステージもストリーム出力ステージも、ハル シェーダーの出力制御ポイントまたはパッチ データを読み取れありません。

  • この列挙型の拡張機能である、入力アセンブラー ステージの新しいトポロジ。

    enum D3D11_PRIMITIVE_TOPOLOGY
    

    トポロジは、IASetPrimitiveTopology を使用して、入力アセンブラー ステージに設定されます。

  • もちろん、新しいプログラミング可能なシェーダー ステージでは、定数バッファー、サンプル、シェーダー リソースを適切なパイプライン ステージにバインドするために、他の状態を設定する必要があります。 この状態を設定するために、これらの新しい ID3D11Device メソッドが実装されています。

方法:

このドキュメントには、テッセレーション ステージを初期化する例も含まれています。

アイテム 形容
方法: ハル シェーダー を作成する
ハル シェーダーを作成します。
方法: ハル シェーダー を設計する
ハル シェーダーを設計します。
方法: テッセレータ ステージ を初期化する
テッセレーション ステージを初期化します。
方法: ドメイン シェーダー を作成する
ドメイン シェーダーを作成します。
方法: ドメイン シェーダー を設計する
ドメイン シェーダーを作成します。

グラフィックス パイプラインの