ストリームアウトを持つジオメトリ シェーダーは、特定の構文で宣言されます。 このトピックでは、構文について説明します。 エフェクト ランタイムでは、この構文は、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);
}
}
関連トピック