前向渲染和延迟渲染之间的性能折衷是什么?


9

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

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

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

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

Answers:


11

通过进行深度预遍并使用该信息拒绝任何实际上不可见的像素,甚至可以使用正向渲染避免不透明对象的透支。但是,根据场景的顶点成本,深度预传递可能会增加不可接受的性能开销。此外,使用GPU的像素着色管道进行渲染意味着您不必为渲染的每个像素支付费用,而是为渲染的每个2x2像素的四边形支付费用。因此,即使进行深度预通过仍会导致三角形边缘浪费工作阴影像素,这些像素将被丢弃。

GPU调度是一个复杂的主题,正向与延迟之间的权衡并非简单地归结为“运行速度更快,但占用的带宽更大”。如果您有两个同样便宜的操作按顺序运行,并且每个操作使用相同数量的资源,则没有理由将它们拆分为单独的着色器:两个分别使用X资源的小波阵面从根本上不会比单个更长的波阵面更好地工作。也使用X资源。但是,如果您有便宜的操作和昂贵的操作要顺序运行,则拆分成单独的着色器可能会受益:通常,着色器将保留在任何时候可能使用的最大资源量。它' 可以想象,正向渲染可能无法使用GPU的所有带宽,因为飞行中的波前太少,因此无法发出足够的操作来饱和带宽。但是如果你如果带宽受限制,则延迟渲染可能没有任何优势(因为它可能会使用更多带宽)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.