Chapter 3 – The Graphics Processing Unit

3.9 合并阶段

正如我们在第二章所谈到的,合并阶段将会把每个独立像素块(由像素着色器生成)的颜色与深度和frame buffer进行关联。DX将其称之为output merger,OpenGL则将其称为per-sample operation。在大多数管线中,stencil-buffer和z-buffer的操作将在这个阶段发生。如果该像素块对于camera可见,那么可能还会进行颜色融合。对于不透明的物体,一般不会有融合的操作,因为像素块的颜色将替代之前color buffer所存储的颜色。一般融合操作只运用于透明的物体和阴影。

假设光栅化所生成的像素,由像素着色器处理,之后在进行z-buffer检测时我们发现这个像素块会被之前绘制的像素块遮盖。那么像素着色器中所有的处理过程都是没有必要的。为了避免这种情况,许多GPU都会在像素着色器之前进行一些合并测试。像素块的z轴深度值将用来检测该像素块是否可见。如果这个像素块不可见,那么我们就将其剔除。这一功能被称为early-z。像素着色器可以改变像素块的z轴深度值或者完全舍弃一个像素块。如果GPU在像素着色器中发现这些操作,那么early-z将被关闭,这也会使管线的效率降低。DX11与OpenGL4.2允许像素着色器启用early-z。第二十三章我们将介绍更多关于early-z以及其他z-buffer优化的方法。有效地使用early-z可以大大优化渲染的性能。

合并阶段并不算完全的固定功能管线。虽然这一阶段不可编程,但我们可以进行设置各种参数。特别是,我们可以使用颜色融合来实现各种不同的效果。最常见的操作是,颜色以及alpha通道的乘法,加法和减法,不过除了这些操作,我们还能使用最小值,最大值和其他的位操作。DX10首次引入了像素着色器的颜色与color buffer的颜色相加的操作。这一功能被称为dual source-color blending,但是其并不适用于多个渲染对象的融合。DX10.1首次引入了对于每个独立buffer进行不同的融合操作。正如我们在上一小节提到的,DX11.3加入了ROV,这一特性从某种程度上让融合(blending)变得可编程,但这会降低性能。ROV和合并阶段都能保证绘制的顺序,这也被称为输出的一致性。无论像素着色器以哪一种顺序进行输出,API会决定这些输出是否要进行排序,之后以输入的顺序(基于物体或者基于三角形)被传输至合并阶段。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据