次の方法で共有


Stream Out 構文

ストリームアウトを持つジオメトリ シェーダーは、特定の構文で宣言されます。 このトピックでは、構文について説明します。 エフェクト ランタイムでは、この構文は、ID3D11Device::CreateGeometryShaderWithStreamOutputへの呼び出しに変換されます。

構文の構築

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0" )
名前 形容
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 )
名前 形容
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 ]; [ ... ; ] ... [ ... ;]"
名前 形容
バッファー 随意。 0 <= Buffer < 4 の整数。値が移動するストリーム アウト バッファーを指定します。
セマンティック 出力する値を指定する文字列と SemanticIndex。
SemanticIndex 随意。 Semantic に関連付けられているインデックス。
マスク 随意。 出力する値のコンポーネントを示すコンポーネント マスク。

 

"$SKIP" というラベルが付いた特殊なセマンティックが 1 つあり、空のセマンティックを示し、ストリーム アウト バッファー内の対応するメモリはそのまま残します。 $SKIP セマンティックは SemanticIndex を持つことはできませんが、マスクを持つことができます。

ストリーム アウト宣言全体を 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)