次の方法で共有


ジオメトリ シェーダー ステージ

geometry-shader (GS) ステージは、入力として頂点と出力で頂点を生成する機能を持つアプリケーション指定のシェーダー コードを実行します。

ジオメトリ シェーダー

1 つの頂点で動作する頂点シェーダーとは異なり、ジオメトリ シェーダーの入力は、完全なプリミティブの頂点 (線の場合は 2 つの頂点、三角形の場合は 3 つの頂点、ポイントの場合は単一の頂点) です。 ジオメトリ シェーダーは、エッジ隣接プリミティブの頂点データを入力として取り込むこともできます (ラインの場合は追加の 2 つの頂点、三角形の場合は 3 つ)。 次の図は、隣接する頂点を持つ三角形と線を示しています。

隣接する頂点を持つ三角形と線の図

種類
テレビ 三角形の頂点
AV 隣接する頂点
LV 線の頂点

 

ジオメトリ シェーダー ステージは、IA によって自動生成されるSV_PrimitiveID システム生成値 を使用できます。 これにより、必要に応じてプリミティブごとのデータをフェッチまたは計算できます。

geometry-shader ステージは、1 つの選択したトポロジを形成する複数の頂点を出力できます (使用可能な GS ステージ出力トポロジ: tristrip、linetrip、pointlist)。 出力されるプリミティブの数は、ジオメトリ シェーダーの呼び出し内で自由に変化する可能性がありますが、出力できる頂点の最大数は静的に宣言する必要があります。 ジオメトリ シェーダー呼び出しから出力されるストリップの長さは任意であり、新しいストリップは RestartStrip HLSL 関数を使用して作成できます。

ジオメトリ シェーダーの出力は、ラスタライザー ステージや、ストリーム出力ステージを介してメモリ内の頂点バッファーに供給できます。 メモリに送られる出力は、個々のポイント/ライン/三角形リストに拡張されます (ラスタライザーに渡されるのとまったく同じ)。

ジオメトリ シェーダーがアクティブになると、パイプラインで先ほど渡されたプリミティブまたは生成されたすべてのプリミティブに対して 1 回呼び出されます。 ジオメトリ シェーダーの各呼び出しは、呼び出し元のプリミティブのデータを入力と見なします。これは、単一の点、単一の線、または単一の三角形であるかどうかです。 パイプラインの以前の三角形ストリップでは、ストリップ内の個々の三角形に対してジオメトリ シェーダーが呼び出されます (ストリップが三角形リストに展開されたかのように)。 個々のプリミティブ内の各頂点のすべての入力データ (つまり、三角形の場合は 3 つの頂点) と、該当する場合は隣接する頂点データを使用できます。

ジオメトリ シェーダーは、出力ストリーム オブジェクトに頂点を追加することで、一度に 1 つの頂点のデータを出力します。 ストリームのトポロジは固定宣言によって決定され、GS ステージの出力として PointStream、LineStream、または TriangleStream のいずれかを選択します。 使用可能なストリーム オブジェクトには、PointStream、LineStream、TriangleStream の 3 種類があり、これらはすべてテンプレート化されたオブジェクトです。 出力のトポロジはそれぞれのオブジェクトの種類によって決まりますが、ストリームに追加される頂点の形式はテンプレートの種類によって決まります。 ジオメトリ シェーダー インスタンスの実行は、ストリームに追加されたデータがシリアルである点を除き、他の呼び出しからのアトミックです。 ジオメトリ シェーダーの特定の呼び出しの出力は、他の呼び出しとは無関係です (ただし、順序は考慮されます)。 三角形のストリップを生成するジオメトリ シェーダーは、呼び出しのたびに新しいストリップを開始します。

ジオメトリ シェーダーの出力がシステム解釈値 (SV_RenderTargetArrayIndexやSV_Positionなど) として識別されると、ハードウェアはこのデータを調べて、値に依存する動作を実行します。また、入力のためにデータ自体を次のシェーダー ステージに渡すことができます。 ジオメトリ シェーダーからのこのようなデータ出力が、頂点単位 (SV_ClipDistance[n] や SV_Position など) ではなく、プリミティブ単位 (SV_RenderTargetArrayIndexやSV_ViewportArrayIndexなど) でハードウェアに対して意味を持つ場合、プリミティブごとのデータはプリミティブに対して出力される先頭の頂点から取得されます。

ジオメトリ シェーダーが終了し、プリミティブが不完全な場合は、部分的に完了したプリミティブがジオメトリ シェーダーによって生成される可能性があります。 不完全なプリミティブは暗黙的に破棄されます。 これは、IA が部分的に完了したプリミティブを処理する方法と似ています。

ジオメトリ シェーダーは、画面空間の派生物が不要な読み込みとテクスチャ サンプリング操作 (samplelevel、samplecmplevelzero、samplegrad) を実行できます。

ジオメトリ シェーダーに実装できるアルゴリズムは次のとおりです。

  • ポイント スプライトの展開
  • ダイナミック パーティクル システム
  • ファー/フィン生成
  • シャドウ ボリュームの生成
  • 単一パスのレンダリングからキューブマップへの変換
  • Per-Primitive マテリアル スワップ
  • Per-Primitive マテリアルのセットアップ - ピクセル シェーダーがカスタム属性補間を実行できるように、重心座標の生成をプリミティブ データとして含めます (高次法線補間の例については、「CubeMapGS サンプル を参照してください)。

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

パイプライン ステージ (Direct3D 10)