Practical Rendering and Computation with Direct3D 11
+ -

3.11.3像素着色器阶段处理

2024-06-25 2 0

我们现在已经看到了像素着色器阶段从光栅化阶段接收的信息类型,以及可以提供哪些额外资源来增加可用的数据。在本节中,我们将首先考虑像素着色器层如何履行其职责的一些机制。接下来,我们将通过考虑像素着色器如何在传统渲染场景中表示对象的材质属性来进一步探索像素着色器。之后,我们将研究新无人机的一些可能用途,并考虑这种新的资源视图类型所能实现的一些常规操作。最后,我们将讨论MSAA如何与像素着色器阶段交互,以及如何控制各种MSAA功能以提高图像质量,同时保持可接受的性能水平,从而完成本节。

像素着色器机制

我们已经看到了数据是如何进入像素着色器阶段的。我们现在可以考虑像素着色器将执行的一些操作,以及它在任意管道配置中必须产生的确切内容。

像素着色器执行

我们的像素着色器阶段的概念操作模型是,当它执行时,每次调用都处理一个片段,然后计算输出颜色以传递到输出合并阶段。由于像素着色器在光栅化发生后进行操作,因此在像素着色器中执行的任何计算都与对象覆盖的片段数成比例执行。无论输入几何体有多复杂,只有几何体覆盖的视口中的片段才会使用像素着色器进行处理。为每个pixelshader调用处理单个片段的概念如图3.72所示。

160212174817

通过遵循此模型并限制线程之间的通信,可以在并行处理元素中同时计算像素着色器的许多不同调用。由于每个调用都从其输入片段中接收自己的数据,并将自己的输出写入片段指定的位置,因此它不依赖于相邻的调用。这方面的概念示意图如图3.73所示。

在较低的硬件级别上,这基本上仍然是正确的,除了像素着色器调用总是在至少2x2组片段中执行。这样做是为了确保可以通过执行离散差分在X和Y方向的调用中计算屏幕空间导数指令。这些派生指令的计算依赖于多个调用同时运行的事实,如果一个变量被传递到其中一个派生指令中,那么GPU将使用相邻调用的变量之差来发现该变量的值如何在屏幕空间上变化。在实践中,此行为对应用程序是透明的,并且像素着色器调用之间的边界保持不变

多渲染目标

我们已经提到,像素着色器计算并输出要传递到输出合并阶段的颜色。然而,这并不局限于单一的颜色。我们将在输出合并阶段部分看到,只要满足一定的大小和格式限制,就可以绑定多达八个不同的渲染目标来从管道接收输出。单像素着色器调用计算并输出要写入到这些渲染目标中的每个渲染目标的颜色。这种同时使用一个以上渲染目标的能力被称为多个渲染目标(MRT),并且提供了提高渲染算法的效率的潜力。

如果算法需要用场景几何体生成的数据填充多个渲染目标,则可以使用传统的单个渲染目标配置一次填充一个渲染目标。这意味着,在顶点着色器、曲面细分阶段、几何体着色器和光栅化器中执行的所有计算都会在每次过程中重复进行。只有像素着色器形成的计算在过程之间不同。使用MRT可以将所有过程组合为一个过程,之后像素着色器将分别写入所有输出。这节省了多次处理几何数据的成本,但仍能使用所需信息填充相同数量的渲染目标。图3.74显示了在该场景中使用MRT和进行多个渲染过程之间的区别。第11章“延迟渲染”提供了MRT使用的一个很好的例子。
160422785161

修改深度值

除了负责为每个片段编写颜色值外,像素着色器还可以向SV_depth系统值语义输出新的深度值。如果像素着色器不写入深度值,则光栅化器阶段中生成的深度将传递到输出合并阶段。但是,在某些情况下,像素着色器更适合指定深度值。在使用广告牌的情况下,这将是有用的。广告牌通常用于模拟更复杂的几何体,其中两个三角形排列成四边形,然后将其对齐以垂直于当前视图方向。纹理应用于四边形,仅渲染两个三角形的结果仍然提供了大量细节。广告牌的概念如图3.75所示。

广告牌通过非常简单的几何图形提供了更多的细节,这是将复杂性引入场景的有效方法。然而,由于广告牌基本上是平的,当它用于与其他场景几何体相交的情况时,复杂几何体的遮挡会被破坏,因为广告牌在其表面上有一个统一的深度。在这种情况下,如果模拟几何体的深度变化包括在公告牌纹理中(例如在alpha通道中),则像素着色器可以将修改后的深度值写入片段,从而将深度复杂性重新引入公告牌几何体。然后,当场景几何体与广告牌相交时,它们实际上会以部分遮挡而不是完全遮挡的方式看起来更有说服力。这种类型的深度修改示例如图3.76所示。

保守深度输出

但是,从像素着色器写入深度值确实有一些缺点。大多数现代GPU都实现了一种效率提高技术,称为Hi-Z。这种技术背后的概念是让GPU硬件执行一些简化形式的遮挡测试,看看当前一批几何体是否能够在最终渲染目标中看到,或者它是否会出现在渲染中的另一个对象之后。如果几何体会被遮挡,那么在进行任何进一步处理之前,它只会被丢弃。当场景中有许多对象重叠时,这降低了流水线执行的总体计算成本。有关如何实现的详细信息因GPU制造商而异,因此此处不详细介绍。但是,在该层次测试中使用的关于几何体大小的一些假设发生在执行像素着色器之前。因此,当在像素着色器中修改深度值时,Hi-Z可能不可用,并且可能会失去其性能优势。

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!