正向渲染是直接根据输入的几何形状和照明信息计算表面碎片的辐射值的过程。延迟渲染将该过程分为两个步骤:首先生成一个包含空间属性的屏幕空间缓冲区(包含通过光栅​​化输入几何图形而构建的材质属性(几何缓冲区或G缓冲区),其次通过组合G-具有照明信息的缓冲区。

延迟渲染通常是对正向渲染的优化。一种解释是,照明是相当昂贵的,并且如果您有任何透支,那么您将照明屏幕上永远不会看到的像素,而如果将材质属性存储在G缓冲区中,然后再照明,则您只会照明一个像素。实际上出现在屏幕上。假设您还可以进行深度预传递,然后再进行深度渲染设置为D3D11_COMPARISON_EQUALGL_EQUAL或等效的深度测试,则这实际上是递延的优势吗?

递延渲染也在GPU上更好地计划的潜力。将一个较大的翘曲/波阵面拆分为一个较小的几何波阵面,然后再将较小的照明波阵面拆分,可以提高占用率(同时飞行中有更多的波阵面)。但是您最终还会占用更多带宽(将大量通道写到G缓冲区,然后在照明期间将它们读回)。显然,这里的细节在很大程度上取决于您的GPU,但是一般的原则是什么?

在决定正向渲染和延迟渲染时是否还有其他实际性能方面的考虑? (假设如有必要,我们可以使用每种技术的变体:即,我们也可以比较分块向前和分块延迟)。

#1 楼

通过进行深度预遍并使用该信息拒绝任何实际上不可见的像素,甚至可以使用正向渲染避免不透明对象的透支。但是,根据场景的顶点成本,深度预传递可能会增加不可接受的性能开销。此外,使用GPU的像素着色管道进行渲染意味着您不必为渲染的每个像素支付费用,而是为渲染的每个2x2像素的四边形支付费用。因此,即使进行深度预传递,仍会导致三角形边缘浪费工作阴影像素,这些像素将被丢弃。 “运行速度更快,但使用更多的带宽。”如果您有两个同样便宜的操作按顺序运行,并且每个操作使用相同数量的资源,则没有理由将它们拆分为单独的着色器:分别使用X资源的两个小波阵面从根本上不会比单个较长的波阵面更好也使用X资源。但是,如果您要执行便宜的操作而又要进行昂贵的操作,则拆分成单独的着色器可能会受益:通常,着色器将保留在任何时候可能使用的最大资源量。可以想象,正向渲染可能无法使用GPU的所有带宽,因为飞行中的波前很少,因此无法发出足够的操作来饱和带宽。但是,如果带宽有限,则延迟渲染可能没有任何好处(因为它可能会使用更多带宽)。

另一个性能问题是,正向渲染仅通过对该对象使用不同的着色器即可支持不同的材质类型(例如,不同的BRDF)。一个简单的延迟渲染器需要以不同的方式(可能是着色器中的一个分支)处理不同的材质类型,因为不再根据要渲染的对象将工作连续地分组为扭曲/波阵面。可以使用平铺渲染器缓解这种情况-如果仅屏幕的特定区域使用其他材质类型(例如,对于头发),则可以将着色器变化与材质类型分支一起使用,仅适用于包含该材质任何像素的瓷砖。