ストリーム出力ステージ
ストリーム出力 (SO) ステージでは、頂点がラスタライザーに到着する直前に、頂点をメモリにストリーミングできます。 ストリーム出力は、パイプライン内のタップのように動作します。 データがラスタライザーに流れ続ける場合でも、このタップをオンにすることができます。 ストリーム出力を介して送信されるデータは、バッファーに連結されます。 これらのバッファーは、後続のパスでパイプライン入力として再循環できます。
ストリーム出力に関する制約の 1 つは、ジオメトリ シェーダーに関連付けられているということであり、すなわち、これらはまとめて作成する必要があります (ただし、"NULL"/"off" にすることができます)。 ただし、ストリーミングされる特定のメモリ バッファーは、特定のジオメトリ シェーダーとストリーム出力ペアに関連付けされていません。 ストリーム出力にフィードする頂点データのどの部分の説明のみがジオメトリ シェーダーに関連付けられています。
ストリーム出力は再利用される順序付けされたパイプライン データを保存するのに有用です。 たとえば、頂点のバッチは、頂点を独立したポイントであるかのようにパイプラインの中に渡し (1 回だけ)、各頂点に”スキニング”操作を適用し、結果をメモリにストリーミングすることで”スキン化”される場合があります。 保存された "スキン化された" 頂点は、その後入力として使用できます。
ストリーム出力を介して書き込まれる出力量は動的であるため、新しい種類の Draw DrawAuto を使用して、ストリーム出力バッファーを入力アセンブラーと共に再利用できるようにする必要があります。実際に書き込まれたデータの量を CPU が関与せずに判断できます。 さらに、ストリーム出力オーバーフローを軽減するだけでなく、ストリーム出力バッファーに書き込まれたデータの量 (D3D10DDI_QUERY列挙のD3D10DDI_QUERY_STREAMOVERFLOWPREDICATE と D3D10DDI_QUERY_STREAMOUTPUTSTATS ) を取得するためにクエリが 必要です。
Direct3D ランタイムは、次のドライバー関数を呼び出して、ストリーム出力の作成と設定を行います。
CalcPrivateGeometryShaderWithStreamOutput