ジオメトリ シェーダー ステージ
ジオメトリ シェーダー (GS) ステージは、頂点を入力としてアプリケーション指定のシェーダー コードを実行し、出力時に頂点を生成できます。 1 つの頂点を操作する頂点シェーダーとは異なり、ジオメトリ シェーダーの入力は、完全なプリミティブの頂点 (つまり、線の場合は 2 つの頂点、三角形の場合は 3 つの頂点、または 1 つの点の場合は 1 つの頂点) と、エッジに隣接するプリミティブの頂点データ (つまり、線の場合は追加の 2 つの頂点、三角形の場合は追加の 3 つの頂点) です。 次の図は、ジオメトリ シェーダーに入力されるプリミティブの例を示しています。
ジオメトリ シェーダーへの別の入力は、入力アセンブラー (IA) によって自動生成されるプリミティブ ID です。 プリミティブ ID を使用すると、ジオメトリ シェーダーは、必要に応じてフェースごとのデータをフェッチまたは計算できます。
ジオメトリ シェーダー ステージでは、複数の頂点を出力して、選択した 1 つのトポロジを形成できます。 使用可能なGS出力トポロジは、トライストリップ、ラインストリップ 、およびポイントリストです 。 ジオメトリ シェーダーが出力するプリミティブの数はさまざまですが、ジオメトリ シェーダーが出力できる頂点の最大数は静的に宣言する必要があります。 ジオメトリ シェーダーが出力するストリップの長さは任意にできます (カット コマンドがあります)。
ジオメトリ シェーダーの出力は、ラスタライザーとメモリ内の頂点バッファーに送信できます。 メモリに送られる出力は、個々のポイント、ライン、およびトライアングルのリストに展開されます(出力がラスタライザーに渡される方法と同様)。
ジオメトリ シェーダー ステージでは、次のアルゴリズムを実装できます。
ポイント スプライト テッセレーション: シェーダーは単一の頂点を取り込み、任意の texcoord、法線、およびその他の属性を持つクワッドの 4 つのコーナーを表す 4 つの頂点 (2 つの出力三角形) を生成します。
ワイド ライン テッセレーション: シェーダーは 2 つのライン頂点 (LV0 と LV1) を受け取り、ワイド ラインを表すクワッドの 4 つの頂点を生成します。 さらに、ジオメトリ シェーダーは、隣接する線の頂点 (AV0 と AV1) を使用して、線の端点でマイタを実行できます。
ファー/フィン生成: 異なるテクスチャ (押し出された面) で複数のオフセットをレンダリングし、ファーのパラ乳酸効果をシミュレートします。 フィンは押し出されたエッジで、角度が斜めでない場合、フェードアウトすることがよくあります。 フィンは、オブジェクトを斜めの角度で見栄えを良くするために使用されます。
シャドウ ボリュームの生成: 押し出すかどうかを決定するために使用される隣接情報。
複数のテクスチャ キューブ面への単一パス レンダリング: プリミティブが投影され、ピクセル シェーダーに 6 回出力されます。 各プリミティブには、立方体の面を選択するレンダー ターゲット配列インデックスが付随します。
重心座標をプリミティブ データとして設定し、ピクセル シェーダーがカスタム属性補間を実行できるようにします。
病理学的なケース: アプリケーションがジオメトリを生成し、そのジオメトリを n パッチでパッチし、そのジオメトリからシャドウ ボリュームを押し出します。 このような場合、マルチパスは、頂点とプリミティブのデータをストリームに出力し、データを循環させる機能を備えたソリューションです。
ジオメトリ シェーダーを呼び出すたびにさまざまな数の出力が生成される可能性があるため、この段階でのハードウェアへの並列呼び出しは、他のパイプライン ステージ (頂点シェーダー ステージやピクセル シェーダー ステージなど) を並列で実行する場合よりも困難になります。 ハードウェア実装ではジオメトリ シェーダー呼び出しが並列で実行されますが、並列ジオメトリ シェーダー呼び出しを実行するために必要な複雑なバッファリングは、アプリケーションがジオメトリ シェーダー ステージで達成できる並列処理のレベルを他のパイプライン ステージと同程度にする必要がないことを意味します。 言い換えると、ジオメトリ シェーダーが持つプログラムの負荷によっては、ジオメトリ シェーダーがパイプラインのボトルネックになる可能性があります。 ただし、ジオメトリ シェーダーの機能を使用するアルゴリズムは、プログラムでジオメトリを生成できないハードウェアで動作をエミュレートする必要があるアプリケーションよりも効率的に実行されるということです。
Direct3D ランタイムは、次のドライバー関数を呼び出して、ジオメトリ シェーダーを作成、設定、破棄します。