次の方法で共有


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

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

ジオメトリ シェーダー

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

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

TV 三角形頂点
AV 隣接頂点
LV 線頂点

 

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

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

ジオメトリ シェーダーの出力は、ラスタライザー ステージに渡すか、ストリーム出力ステージでメモリー内の頂点バッファーに渡すか、またはこれら両方に渡すことができます。 メモリーに渡された出力は、個別の点/線/三角形のリストに展開されます (ラスタライザーに渡されるときとまったく同じように展開されます)。

ジオメトリ シェーダーがアクティブである場合、前にパイプラインで渡された、または生成されたすべてのプリミティブについて 1 回呼び出されます。 ジオメトリ シェーダーの呼び出しのたびに、入力となるプリミティブのデータが 1 つの点、1 つの線、または 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)。

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

  • ポイント スプライト拡張
  • 動的パーティクル システム
  • Fur/Fin の生成
  • シャドウ ボリュームの生成
  • 単一パスでのキューブマップへのレンダリング
  • プリミティブ単位のマテリアル スワップ
  • Per-Primitiveマテリアルの設定 - ピクセル シェーダーがカスタム属性補間を実行できるように、バリセントリック座標の生成をプリミティブ データとして含めます (高次正規補間の例については、「 CubeMapGS サンプル」を参照)。

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

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