流出语法

使用流出流的几何着色器使用特定语法声明。 本主题介绍 语法。 在效果运行时中,此语法将转换为对 ID3D11Device::CreateGeometryShaderWithStreamOutput 的调用。

构造语法

[ StreamingShaderVar = ] ConstructGSWithSO( ShaderVar, "OutputDecl0" )
“属性” 说明
StreamingShaderVar 可选。 一个 ASCI 字符串,用于唯一标识带有流出流的几何着色器变量的名称。这是可选的,因为 ConstructGSWithSO 可以直接放置在 SetGeometryShader 或 BindInterfaces 调用中。
ShaderVar 几何着色器或顶点着色器变量。
OutputDecl0 定义流 0 中哪些着色器输出被流式传输出去的字符串。有关语法,请参阅下文。

 

这是在fx_4_0文件中定义的语法。 请注意,在gs_4_0和vs_x着色器中,只有一个数据流。 生成的着色器会将一个流输出到流出单元和光栅器单元。

[ 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着色器最多可以定义四个数据流。 生成的着色器将每个非 NULL 输出声明的流输出单元输出一个流,将一个流输出光栅器单元。

流出声明语法

" [ Buffer: ] Semantic[ SemanticIndex ] [ .Mask ]; [ ... ; ] ... [ ... ;]"
“属性” 说明
Buffer 可选。 一个整数,0 <= 缓冲区 < 4,指定值将转到哪个流出缓冲区。
语义 一个字符串,以及 SemanticIndex,用于指定要输出的值。
SemanticIndex 可选。 与语义关联的索引。
掩码 可选。 一个组件掩码,指示要输出值的哪些组件。

 

有一个标记为“$SKIP”的特殊语义,指示空语义,使流出缓冲区中的相应内存保持不变。 $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) (效果