如何:为多个输出流编制索引

在着色器模型 5 中,几何着色器最多可以支持 4 个单独的流。 这意味着单个着色器可以在一到四个输出流之间输出,具体取决于声明的流数。

为多个输出流编制索引

  1. 使用流模板类型定义数据流。

        inout PointStream<OutVertex1> myStream1, 
    
  2. 使用流模板类型定义第二个数据流。

        inout PointStream<OutVertex2> myStream2 )
    
  3. 使用流输出对象内部函数 ((如 Append 或 RestartStrip) )将数据输出到 (或两者) 流。

    void MyGS( 
        InVertex verts[2], 
        inout PointStream<OutVertex1> myStream1, 
        inout PointStream<OutVertex2> myStream2 )
    {
        OutVertex1 myVert1 = TransformVertex1( verts[0] );
        OutVertex2 myVert2 = TransformVertex2( verts[1] );
        myStream1.Append( myVert1 );
        myStream2.Append( myVert2 );
    }
    

使用单个输出流时,可以发出三角形带、线条带或点列表。 在流出缓冲区中存储三角形和线条带时,它们将分别扩展到三角形和线条列表。 还可以光栅化一个流,而不将其发送到内存缓冲区。

使用多个输出流时,所有流都必须包含点,并且最多可以将一个输出流发送到光栅器。 更常见的是,应用程序不会光栅化任何流。

将数据流式传输到缓冲区后,可以使用该数据来呈现任何基元类型,而不仅仅是用于填充缓冲区的基元类型。

几何着色器的总输出限制为 1024 个标量。 如果存在多个流,则从最大流类型乘以最大顶点计数计算标量数。

着色器模型 4 和着色器模型 5 之间的差异:
着色器模型 4:

  • 流输出的最大标量数为 64。
  • 每个组件的寄存器掩码必须在索引范围内匹配。
着色器模型 5:
  • 流输出的最大标量数为 128。
  • 每个组件寄存器掩码不需要在索引范围内匹配。
  • 输出的动态索引必须跨所有流合法。
  • 内插模式不需要匹配流。

几何着色器功能