3.12.4输出合并管道输出
在本节中,我们已经了解了在将管道数据写入绑定到输出合并阶段的资源之前对其执行的操作。
管道执行总共可以写入三种不同类型的资源:渲染目标、无序访问视图和深度模具目标。
渲染目标接收来自混合函数的输出。
写入渲染目标的每个片段在混合并最终写入渲染目标之前,必须经过模具测试和深度测试。如果正在使用MRT,则每个渲染目标都将写入一个源自像素着色器的混合值。如果使用渲染目标阵列,则在光栅化器阶段的输入处使用SV_RenderTargetArrayIndex系统值语义来确定适当的渲染目标切片。因此,当数据到达混合函数的输出时,已经选择了适当的纹理切片。
相比之下,写入UAV的数据由像素着色器阶段直接控制,不需要通过任何测试即可成功进入输出资源。当像素着色器修改资源时,这些更改会立即提交给GPU,并在GPU的内存系统将值写入内存后立即生效。在这个编写过程中存在一些延迟,因此,在设计算法时,不能假设其结果立即可用。
深度模板目标稍微复杂一些。输出数据必须通过深度测试和模具测试才能写入输出资源的深度部分。此外,必须在深度状态对象中启用深度写入。模具数据可以以不同的方式更新,具体取决于深度测试和模具测试的组合。由于这些都是可配置的设置,所以进入输出合并阶段的数据流更新模具数据的时间和方式或多或少取决于应用程序。
在完成流水线执行之后,这些资源中的每一个的修改内容可用于进一步的渲染过程和计算过程,或者甚至可用于CPU的直接操作。在MSAA渲染的情况下,在使用资源之前还需要执行一个步骤。渲染完成后,通常需要将MSAA渲染目标解析为非MSAA纹理。在Direct3D 11中,这是通过调用ID3DllDeviceContext::ResolveSubresource()方法来完成的。执行此解析会将各个子采样的值合并为一个值,从而生成一个适合在屏幕上显示或使用常规着色器采样方法进行采样的纹理。执行解析时应用的过滤器特定于硬件和驱动程序,以及为渲染目标指定的质量级别。但是,在大多数情况下,会使用盒式过滤器。对于箱式滤波器,所有子样本的权重相等,使其成为子样本值的简单算术平均值。