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);
}
}
関連トピック