延迟着色

在计算机图形领域，延迟着色（deferred shading）是一种在三维空间中着色的技术。这种着色的算法把目标分成很多的小块写入中间缓冲储存区，而后再合并。这种方法区别于直接把着色结果写进颜色的帧数缓冲里。在目前的硬件中，倾向于使用多重的渲染目标去避免重复转换矢量点。一旦所有需要的缓冲建好，就直接被读进一种着色算法中，合并在一起从而得出最后的结果。 这样，着色一个场景所需的计算和内存的带宽被减少到了这些可见的部分中，从而降低了着色深度的复杂性。

优势
延迟着色的主要优势因为Z-buffer出现而有所减少，但是其他的一些优点还是毋庸质疑。比如提供了一种简单的管理复杂光源的方法，去除了其他复杂的着色源的管理，让渲染流程更加简单。这些在开发软件的过程中由开发者去决定的相对来说比较小的优势，导致了无止境的争论。

延迟着色的一个特别的用途在于推迟光照。渲染目标为了光照的着色，会调用一个G-buffer去储存各种参数。通常储存的数据是颜色，表面的法向和观察的位置。无论在加光照的步骤里是不是需要这些数据，他们理论上是可以存起来的。

缺陷
因为使用了多重的渲染目标，常占用一个浮点，导致使用内存的带宽会比直接渲染的技术多。现代图形硬件的数学计算比内存的存取快。再加上在未来的硬件中，可能数学计算和内存的表现会有更大的偏重， 这就导致了延迟着色技术可能不是一个长久的解决方案。

延迟着色的另一个重要的缺陷在于它不能计算透明。虽然这个问题在Z-buffer场景中是普遍存在的，一般会用延迟和排序的方法渲染场景中透明的部分。

延迟光照
延迟光照（也称为Light Pre-Pass）是对延迟着色的修改。此技术需要三步，而不是延迟着色的两个。在第一次绘制场景几何体时只逐像素输出照明所需的属性至G缓冲，屏幕空间“延迟”光照后仅输出漫反射和高光反射的光照数据，因此必须进行第二次绘制以读回光照数据并输出最终的每像素着色结果。延迟照明的明显优势是G-Buffer的尺寸急剧减小，显而易见的成本是需要绘制场景两次，此外延迟照明中的延迟传递必须分别输出漫反射和高光反射，而延迟着色仅需要输出单个组合的辐射度。

由于G缓冲区尺寸的减小，这种技术可以部分克服延迟着色的一个严重缺点 - 多材料。另一个可以解决的问题是MSAA，因为可以不依赖MRT延迟光照可以在DirectX 9硬件上使用MSAA。

Y