Unity 渲染教程(十三):延迟渲染

本文深入探讨Unity中的延迟渲染路径,对比前向渲染,详细解释了延迟渲染的优势,如减少绘制调用,尤其在处理多个光源时。内容涵盖了渲染路径的切换、延迟渲染的工作原理、G缓冲区的使用以及延迟渲染下的阴影、反射处理。通过对场景的分析,展示了延迟渲染在不同光照模式下的表现,并提供了相关工程文件下载链接。
摘要由CSDN通过智能技术生成

另一个渲染路径

到目前为止,我们一直使用的是Unity的前向渲染路径。但这不是Unity支持的唯一渲染方法。还有延迟渲染路径。而且还有遗留的顶点光照和传统的延迟渲染路径,但是我们不会涉及这些遗留的路径。

所以除了前向渲染路径之外,还有一个延迟渲染路径,但是为什么我们要使用这个延迟渲染路径呢?毕竟,我们可以使用前向渲染路径来渲染我们想要的一切。为了回答这个问题,我们来看看这两种渲染方法之间的差异。

渲染路径之间的切换

使用哪个渲染路径由项目的图形设置来定义。你可以通过编辑/项目设置/图形来找到这个设置。渲染路径和其他一些设置分三个层级进行配置。这些层级对应于不同类别的图形处理器。图形处理器越好,Unity使用的层级就越高。你可以通过编辑器/图形仿真子菜单来选择编辑器使用的层级。

每一层级的图形设置。

要更改渲染路径,请禁用所需层级的“使用默认值”,然后选择“前向渲染”或是“延迟渲染”作为渲染路径。

绘制调用的比较

我将使用《渲染7:阴影》教程中的阴影场景来比较两种渲染方法。这个场景的环境光抢断设置为零,以便使得阴影更加可见。因为我们自己的着色器不支持延迟渲染,所以更改所使用的材质,因此现在它依赖于标准着色器。

场景中有不少物体和两个方向光源。让我们来看看两个方向光源不启用阴影和启用了阴影之间的对比。

阴影场景,两个方向光源不启用阴影和启用了阴影之间的对比。

在使用前向渲染路径的同时,使用帧调试器来检查场景的渲染方式。

场景中有66个几何对象,全部可见。如果动态批处理是可用的,那么这些几何对象就可以少于66个批次绘制出来。然而,这只适用于单个定向方向光源。由于有额外的光源,不能使用动态批处理。并且因为有两个方向光源,所有的几何对象被绘制两次。所以一共需要132个绘制调用来绘制这些几何对象,加上天空盒的绘制一共133个绘制调用。

前向渲染,在没有阴影的情况下。

当启用阴影的时候,我们需要更多的绘制调用来生成级联阴影贴图。回想下如何创建方向光源的阴影贴图。首先,深度缓冲区被填充,由于一些动态批处理,这只需要48次绘制调用。然后,创建级联阴影贴图。第一个光源的阴影贴图最终需要111个绘制调用,而第二个光源的阴影贴图最终需要121个绘制调用。这些阴影贴图被渲染屏幕空间缓冲区,在那里会执行过滤。然后几何体被绘制,每次只针对亮一个光源。这样做需要418个绘制调用。

前向渲染,在启用阴影的情况下。

现在,再次禁用阴影并切换到延迟渲染路径。 除了多重采样抗锯齿已经关闭以外,场景看起来还是一样的。这次会如何绘制?

为什么多重采样抗锯齿不能再延迟渲染模式下工作?

延迟渲染依赖于每个片段存储的数据,这是通过纹理来完成的。这与多重采样抗锯齿不兼容,因为抗锯齿技术依赖于子像素数据。虽然三角形的边缘仍然可以从多重采样抗锯齿中受益,但延迟渲染的数据仍然是混叠的。你将不得不依靠一个后处理过滤器来进行抗锯齿。

延迟渲染,在没有阴影的情况下。

显然,一个GBuffer被渲染,这需要45个绘制调用。每个对象一个绘制调用,再加上一些动态批处理。然后深度纹理被复制,然后紧跟着三个绘制调用来处理反射。在那之后,我们处理光照,这需要两个绘制调用,每个光源一个。最后还有一个渲染通道来处理天空盒,总共55个绘制调用。

55比起133来说是少了不少。看起来延迟渲染只绘制每个对象一次,而不是每个光源一次。除此之外,还有一些其他工作,每个光源都有它自己的绘制调用。那么当启用阴影的时候该怎么办?

延迟渲染,在启用阴影的情况下。

我们看到两个阴影贴图都被渲染,然后在屏幕空间中进行过滤,就在光照绘制之前。就像在前向渲染模式一样,这增加了236个绘制调用,总共291个绘制调用。由于延迟渲染已经创建了深度纹理,所以我们可以免费得到这个深度纹理。291次绘制调用也比418次绘制调用少了不少。

拆分工作与前向渲染相比,在渲染多个光源的时候,延迟渲染似乎更加有效。前向渲染对每个物体每个光源都需要一个额外的附加渲染通道,但延迟渲染不需要这个额外的附加渲染通道。当然,这两种渲染方法还是要渲染阴影贴图,但延迟渲染不需要为方向光源阴影所需的深度纹理支付额外的成本。延迟渲染路径如何做到这一点?

要渲染一些东西,着色器必须先获取网格数据,将网格数据转换为正确的空间、进行插值、检索和导出表面属性,并计算光照。前向渲染的着色器必须对照亮对象的每个像素光重复所有这些过程。由于深度缓冲器已经被预分配好,所以附加渲染通道比基础渲染通道成本更低,并且附加渲染通道不使用间接光照。但是,附加渲染通道还必须重复基础渲染通道已经完成的大部分工作。

重复的工作。

既然几何体的属性每次都相同,为什么我们不缓存它们? 让基础渲染通道把这些数据存储在缓冲区中。然后附加渲染通道可以重用这些数据,消除重复的工作。我们必须为每个片段存储这些数据,所以我们需要一个适合显示的缓冲区,就像深度缓冲区和帧缓冲区一样。

缓存表面的属性。

现在我们在缓冲区里面拥有我们计算光照需要的所有几何数据。唯一缺少的就是光源本身。但是这意味着我们不再需要渲染几何。我们可以渲染光照效果。此外,基础渲染通道只需要填充缓冲区。所有的直接光照计算都可以推迟到光源被单独渲染的时候。因此这种方法被称为延迟渲染。

延迟渲染。

许多个光源

如果你只使用一个光源,那么延迟这个光源的光照计算本身就不会提供任何好处。但是当使用很多光源的时候,延迟光源的光照计算就会起效果。每一个额外的光源只增加一点额外的工作,只要他们不投射阴影就没问题。

另外,当单独渲染几何体和灯光的时候时,有多少个光源可以影响对象是没有数量限制的。所有光源都是像素光,照亮其范围内的一切。像素光数量这个质量设置不适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农老K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值