次の方法で共有


Stream Out 構文

stream out を含むジオメトリ シェーダーは、特定の構文で宣言されます。 このトピックでは、構文について説明します。 効果ランタイムでは、この構文は ID3D11Device::CreateGeometryShaderWithStreamOutput の呼び出しに変換されます。

構文の構築

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0" )
Name 説明
StreamingShaderVar 省略可能。 ストリーム アウトを使用してジオメトリ シェーダー変数の名前を一意に識別する ASCI 文字列。ConstructGSWithSO は SetGeometryShader または BindInterfaces 呼び出しに直接配置できるため、これは省略可能です。
ShaderVar ジオメトリ シェーダーまたは頂点シェーダー変数。
OutputDecl0 ストリーム 0 でどのシェーダー出力をストリーミングするかを定義する文字列。構文については、以下を参照してください。

 

これは、fx_4_0 ファイルで定義された構文です。 gs_4_0シェーダーとvs_x シェーダーでは、データストリームは 1 つだけであることに注意してください。 結果のシェーダーは、ストリーム出力ユニットとラスタライザー ユニットの両方に 1 つのストリームを出力します。

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0", "OutputDecl1", "OutputDecl2", 
"OutputDecl3", RasterizedStream )
Name 説明
StreamingShaderVar 省略可能。 ストリーム アウトを使用してジオメトリ シェーダー変数の名前を一意に識別する ASCI 文字列。ConstructGSWithSO は SetGeometryShader または BindInterfaces 呼び出しに直接配置できるため、これは省略可能です。
ShaderVar ジオメトリ シェーダーまたは頂点シェーダー変数。
OutputDecl0 ストリーム 0 でどのシェーダー出力をストリーミングするかを定義する文字列。構文については、以下を参照してください。
OutputDecl1 ストリーム 1 でどのシェーダー出力をストリーミングするかを定義する文字列。構文については、以下を参照してください。
OutputDecl2 ストリーム 2 でどのシェーダー出力をストリーミングするかを定義する文字列。構文については、以下を参照してください。
OutputDecl3 ストリーム 3 でどのシェーダー出力をストリーミングするかを定義する文字列。構文については、以下を参照してください。
RasterizedStream ラスタライザーに送信するストリームを指定する整数。

 

gs_5_0シェーダーでは、最大 4 つのデータ ストリームを定義できることに注意してください。 結果のシェーダーは、NULL 以外の出力宣言ごとにストリーム出力ユニットに 1 つのストリームを出力し、1 つのストリームをラスタライザー ユニットに出力します。

Stream Out 宣言の構文

" [ Buffer: ] Semantic[ SemanticIndex ] [ .Mask ]; [ ... ; ] ... [ ... ;]"
Name 説明
バッファー 省略可能。 値が移動するストリーム 出力バッファーを指定する整数 0 <= バッファー < 4。
セマンティック 出力する値を指定する文字列と SemanticIndex。
SemanticIndex 省略可能。 Semantic に関連付けられているインデックス。
Mask 省略可能。 出力する値のコンポーネントを示すコンポーネント マスク。

 

"$SKIP" というラベルが付いた 1 つの特別なセマンティックがあり、空のセマンティックを示し、ストリーム内の対応するメモリは変更されません。 $SKIP セマンティックは SemanticIndex を持つことはできませんが、Mask を持つことができます。

ストリーム アウト宣言全体を NULL にすることができます。

struct GSOutput
{
int4 Pos : Position;
int4 Color : Color;
int4 Texcoord : Texcoord;
};

[maxvertexcount(1)]
void gsBase (inout PointStream<GSOutput> OutputStream, inout PointStream<GSOutput> OutputStream1)
{
GSOutput output;
output.Pos = int4(1,2,3,4);
output.Color = int4(5,6,7,8);
output.Texcoord = int4(9,10,11,12);
OutputStream.Append(output);

output.Pos = int4(1,2,3,4);
    output.Color = int4(5,6,7,8);
output.Texcoord = int4(9,10,11,12);
OutputStream1.Append(output);
};


GeometryShader pGSComp = CompileShader(gs_5_0, gsBase());
GeometryShader pGSwSO = ConstructGSWithSO(pGSComp, "0:Position.xy; 1:Position.zw; 2:Color.xy", 
                                                   "3:Texcoord.xyzw; 3:$SKIP.x;", NULL, NULL, 1);

// The following two passes perform the same operation
technique11 SOPoints
{
    pass 
    {
        SetGeometryShader(ConstructGSWithSO(pGSComp, "0:Position.xy; 1:Position.zw; 2:Color.xy", 
                                                     "3:Texcoord.xyzw; 3:$SKIP.x;", NULL, NULL, 1));
    }
    pass 
    {
        SetGeometryShader(pGSwSO);
    }
}

効果 (Direct3D 11)