流输出阶段

流输出(SO)阶段可以在这些顶点到达光栅器之前将顶点流式传输到内存中。 流输出的工作方式就像管道中的水龙头。 即使数据继续流向光栅器,也可以启用此功能。 通过流输出发送的数据将连接到缓冲区。 这些缓冲区可以在后续传递时作为管道输入重新循环。

关于流输出的一个约束是,它与几何着色器紧密关联,因为它们必须同时创建(尽管任意一个可以是“NULL”或“关闭”)。 尽管如此,被流式传输到的特定内存缓冲区并不绑定到某个特定的几何着色器和流输出对上。 只有要馈送到流输出的顶点数据部分的描述与几何着色器相关联。

流输出对于保存将重复使用的有序管道数据可能很有用。 例如,一批顶点可能通过将顶点传递到管道中来“皮肤化”(就像它们是独立的点一样),对每个顶点应用“皮肤化”作,并将结果流式传输到内存中。 保存的“皮肤”顶点随后可用作输入。

由于通过流输出写入的输出量是动态的,因此需要使用新类型的 DrawAuto 来允许流输出缓冲区与输入汇编程序一起重复使用,而无需 CPU 参与来确定实际写入的数据量。 此外,需要查询以缓解流输出溢出,并检索写入流输出缓冲区的数据量(D3D10DDI_QUERY 枚举中的 D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE 和 D3D10DDI_QUERY_STREAMOUTPUTSTATS)。

Direct3D 运行时调用以下驱动程序函数来创建和设置流输出:

CalcPrivateGeometryShaderWithStreamOutput (计算具有流输出的私有几何着色器)

创建带流输出的几何着色器

SoSetTargets