3.11.2像素着色器状态配置
在清楚了解像素着色器程序可以接收哪些数据后,我们现在将考虑应用程序可以使用哪些类型的状态配置。像素着色器阶段是一个可编程阶段,这意味着它可以访问我们在各个管道阶段看到的标准通用着色器核心功能。再一次,我们不会在这里重复任何代码列表,因为它们本质上与我们在顶点着色器部分中看到的相同。下面列出了这些常见的方法,便于参考。
ID3DllDeviceContext::PSSetShader()
ID3DllDeviceContext::PSSetConstantBuffers()
ID3DllDeviceContext::PSSetShaderResources()
ID3DllDeviceContext::PSSetSamplers()
除了公共着色器核心的标准资源外,像素着色器也还可以访问新的无序访问视图,这提供了直接从像素着色器读取和写入资源的随机访问。最后,一个名为dearlydepthstencil的函数属性可以用于强制在像素着色器之前执行深度模板测试。我们将在以下章节中更详细地研究这些独特的配置。
无序访问视图
像素着色器阶段可以使用无序访问视图。与提供对资源的只读随机访问的着色器资源视图不同,无序访问视图允许读写随机访问。这使像素着色器程序可以执行分散写入操作,这意味着它可以通过编程方式决定将写入资源的数据存储在哪里。在访问无人机之前,像素着色器只能在生成碎片时由光栅化阶段确定的位置写入输出渲染目标和深度模板渲染目标。
将无序访问视图绑定到管道以在像素着色器中使用的方法是通过设备上下文执行的,就像它用于所有其他管道配置一样。然而,在这种情况下,无序访问视图实际上绑定到输出合并阶段的管道,而不是像素着色器阶段。这样做是为了使渲染目标、深度模板目标和将从管道接收输出的任何无人机都绑定到同一方法调用中的像素着色器的输出。这也将所有可能的管道输出源分组到单个管道阶段,这在一定程度上简化了管道概念。在输出合并部分,我们将看到资源是如何在无人机的像素着色器中使用的。
早期深度模板测试
像素着色器阶段的另一个独特配置是从像素着色器程序的源代码中执行的。可以在像素着色器程序之前声明earlydepthstencil函数属性,以指示应在执行像素着色器之前执行深度和模具测试(深度和模具试验将在输出合并阶段部分中详细介绍)。
这些测试通常由硬件实现在管道中尽可能早地执行,但此属性强制测试尽早执行。这是为了通过消除在深度测试或模板测试中失败并因此被丢弃的碎片来提高特定算法的效率。通过这样做,可以防止从未通过深度或tencil测试的片段调用任何像素着色器。当场景已经光栅化到深度缓冲区时,这可能特别有用,并且需要第二次渲染过程。
需要该属性的另一种更微妙的情况是,渲染管道仅通过像素着色器向UAV输出数据。在这种情况下,数据被阻止写入输出合并,因此管道永远不会执行深度或模板测试。但是,如果仍然需要这些测试,则必须使用此函数属性明确强制执行这些测试。