ジオメトリ シェーダー (GS) ステージ

ジオメトリ シェーダー (GS) ステージでは、プリミティブの全体の三角形、線、点が、隣接する頂点と共に処理されます。 これは、ポイント スプライト拡張、動的パーティクル システム、シャドウ ボリュームの生成などのアルゴリズムで便利です。 これは、ジオメトリ増幅と減幅をサポートします。

目的と用途

ジオメトリ シェーダー ステージでは、プリミティブの全体、つまり三角形 (3 つの頂点と最大 3 つの隣接頂点)、線 (2 つの頂点と最大 2 つの隣接頂点)、点 (1 つの頂点) を処理します。

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

ジオメトリ シェーダーは、限定的なジオメトリの増幅と減幅もサポートしています。 ジオメトリ シェーダーは、入力プリミティブに対して、プリミティブを破棄することも、1つまたは複数の新しいプリミティブを出力することもできます。

ジオメトリ シェーダー (GS) ステージはプログラム可能なシェーダー ステージです。グラフィックス パイプラインの図では角丸ブロックとして表示されます。 このシェーダー ステージは、シェーダー モデル (「共通シェーダー コア」を参照) に基づいて構築された、独自の機能を公開します。

ジオメトリ シェーダー ステージは、次のようなアルゴリズムに最適です。

  • ポイント スプライト拡張
  • 動的パーティクル システム
  • Fur/Fin の生成
  • シャドウ ボリュームの生成
  • 単一パスでのキューブマップへのレンダリング
  • プリミティブ単位のマテリアル スワップ
  • プリミティブ単位のマテリアル セットアップ: この機能にはプリミティブ データとしての重心座標の生成も含まれています。これにより、ピクセル シェーダーはカスタム属性補間を実行できます。

入力

ジオメトリ シェーダー ステージでは、アプリケーション指定のシェーダー コードが、プリミティブ全体を入力として実行され、出力では頂点を生成することができます。 1 つの頂点を処理する頂点シェーダーとは異なり、ジオメトリ シェーダーの入力はプリミティブ全体 (三角形の 3 つの頂点、線の 2 つの頂点、点の 1 つの頂点など) の頂点です。 また、ジオメトリ シェーダーでは、エッジ隣接プリミティブの頂点データを入力として受け取ることができます (三角形の場合は追加の 3 つの頂点、線の場合は追加の 2 つの頂点)。

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

ジオメトリ シェーダーがアクティブである場合、前にパイプラインで渡された、または生成されたすべてのプリミティブについて 1 回呼び出されます。 ジオメトリ シェーダーの呼び出しのたびに、入力となるプリミティブのデータが 1 つの点、1 つの線、または 1 つの三角形のいずれになるか確認されます。 前にパイプラインで生成された三角形ストリップでは、ストリップ内の三角形ごとにジオメトリ シェーダーが呼び出されます (ストリップが三角形リストに展開されている場合と同様になります)。 個々のプリミティブ内の各頂点のすべての入力データが利用可能なほか (三角形の場合は 3 つの頂点)、隣接頂点のデータも利用可能です (該当し、利用可能な場合)。

一般的な頂点の略語:

省略形 項目
TV 三角形頂点
LV 線頂点
AV 隣接頂点

 

出力

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

ジオメトリ シェーダー インスタンスの実行は、ストリームに追加されるデータがシリアルであることを除き、他の呼び出しからアトミックです。 ジオメトリ シェーダーの特定の呼び出しの出力は、他の呼び出しから独立しています (ただし、順序は考慮されます)。 三角形ストリップを生成するジオメトリ シェーダーは、すべての呼び出しで新しいストリップを開始します。

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

ジオメトリ シェーダーは、頂点を出力ストリーム オブジェクトに追加することで 1 つの頂点ごとにデータを出力します。 ストリームのトポロジは、固定された宣言によって決定され、GS ステージの出力として TriangleStreamLineStreamPointStream のいずれかを選択します。

利用可能なストリーム オブジェクトには TriangleStreamLineStreamPointStream の 3 種類があり、これらはすべてテンプレート化されたオブジェクトです。 出力のトポロジはそれぞれのオブジェクトの種類によって決定され、ストリームに追加される頂点のフォーマットはテンプレートの種類によって決定されます。

ジオメトリ シェーダー出力が、システム解釈値 (たとえば、SV_RenderTargetArrayIndexSV_Position) として識別されると、ハードウェアは、データ自体を次のシェーダー ステージに入力として渡すことができるほか、このデータを参照し、その値に応じて特定の動作を実行します。 ジオメトリ シェーダーから出力されたこのようなデータが、頂点単位ではなく (SV_ClipDistance[n]SV_Position など)、プリミティブ単位で (SV_RenderTargetArrayIndexSV_ViewportArrayIndex など) ハードウェアに対して有意な場合、プリミティブに対して生成された最初の頂点からプリミティブ単位のデータが取得されます。

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

ジオメトリ シェーダーは、スクリーン空間の微分を必要としないロードおよびテクスチャー サンプリング処理を実行できます (samplelevelsamplecmplevelzerosamplegrad)。

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