流输出 (SO) 阶段

流输出 (SO) 阶段可将顶点数据从之前的有效阶段输出(或流式传输)至内存中的一个或多个缓冲区。 流出到内存的数据可以作为输入数据再次循环回到管道,或者从 CPU 读回。

用途和用法

流输出阶段在管道中的位置图

流输出阶段可将管道中的基元数据沿着到光栅器的路线流到内存中。 之前阶段的数据可流出到内存,和/或传入光栅器。 流出到内存的数据可以作为输入数据再次循环回到管道,或者从 CPU 读回。

流出到内存的数据可在后续渲染传递中读回到管道,也可复制到暂存资源(以便由 CPU 读取)中。 流出的数据量各有不同;Direct3D 旨在处理数据,无需查询 (GPU) 写入数据量。-->

将流输出数据馈送至管道的方式有两种:

  • 可将流输出数据回送至输入汇编程序 (IA) 阶段。
  • 流输出数据可由可编程的着色器使用加载功能读取。

输入

来自之前着色器阶段的顶点数据。

输出

流输出 (SO) 阶段连续地将来自前一活动阶段的顶点数据(例如几何着色器 (GS) 阶段)输出(或流入)到内存中的一个或多个缓冲区。 如果几何着色器 (GS) 阶段无效,那么流输出 (SO) 阶段会持续地将域着色器 (DS) 阶段的顶点数据输出至内存缓冲区(如果 DS 也无效,则从顶点着色器 (VS) 阶段输出)。

三角形或直线带与输入汇编程序 (IA) 阶段绑定时,每个带都会在流出之前转换为列表。顶点始终展开写成完整基元(例如,三角形一次为 3 个顶点);不完整的基元绝不会流出。相邻的基元类型会在数据流出之前放弃相邻数据。

流输出阶段支持最多同时 4 个缓冲区。

  • 如果你将数据传入多个缓冲区,那么每个缓冲区仅可采集一个逐顶点元素(最多 4 个组件),隐含数据步幅等于各缓冲区中的元素宽度(兼容针对着色器阶段输入绑定单元素缓冲区的方式)。 此外,如果缓冲区的大小不同,那么在任何一个缓冲区的容量满时,写入即会停止。
  • 如果你将数据流式传入单个缓冲区,那么该缓冲区最多可采集 64 个逐顶点数据标量组件(256 字节或更少),而顶点步幅最高为 2048 字节。

图形管道