延迟渲染路径

延迟渲染路径

此页面将详细介绍延迟渲染路径。参见 Wikipedia: 延迟渲染以获取介绍性的技术概述。

概述

当使用延迟渲染时,在单个GameObject物体上起作用的灯光的数量就没有限制。所有的灯光都是逐像素计算的,这意味着它们都能正确地与法线贴图交互。除此之外,所有的灯光都能拥有剪影和阴影。

延迟渲染的一个优势就是处理光照的开销是与灯光照亮的像素数量成正比。这由场景里的灯光的体积所决定,而跟它照亮了多少个GameObject无关。因此,可以通过保持小体积的灯光来提高性能。延迟渲染还拥有高度一致和可预测的行为。每个灯光的影响都是逐像素计算的,因此不存在灯光在大的三角形上计算的故障。

它也有劣势,延迟渲染不支持抗锯齿,不能处理半透明的GameObject(这些物体使用前向渲染路径渲染)。它也不支持Mesh Renderer的Receive Shadows标记,剔除遮罩只有有限的支持。你最多只能使用4个剔除遮罩。这就是说,剔除遮罩必须至少包含所有的层级,除去其中的任意4个层级,因此32个层级中的28个层级都必须被设置。否则你将会获得图形瑕疵。

必备条件

显卡要有多重渲染目标(MRT)功能,要支持Shader Model 3.0(或以上),要支持深度渲染纹理。大部分于2006年之后生产的PC显卡都支持延迟渲染,包括GeForce 8xxx或更新的显卡,Radeon X2400或更新的显卡,Intel G45或更新的显卡。

在移动端,所有运行OpenGL ES 3.0或以上的设备都支持延迟渲染。

注意:当使用正交投影时,将会不支持延迟渲染。如果某个相机的投影模式设置成正交,那么它将会回退到前向渲染模式。

性能因素

在延迟渲染模式下,渲染实时灯光的开销是与灯光照亮的像素数量成正比的,跟场景复杂度无关。因此小范围的点光源或者聚光灯的开销是很低的。如果它们被场景里的GameObject全部或者部分遮挡,那么开销会更低。

当然,拥有阴影的灯光比没有阴影的灯光开销要大一些。在延迟渲染模式下,对于每个阴影投射的灯光,投射阴影的GameObject仍然需要渲染一次或者更多次。而且应用阴影的光照着色器比不开阴影的有更大的开销。

实现细节

那些不支持延迟渲染的物体将会在延迟渲染结束后使用前向渲染路径来渲染。

几何缓冲区(g-buffer)里的默认的渲染目标(RT0 ~ RT4)的布局如下方列表所示。数据类型分布在每个渲染目标的多个通道上。圆括号里标注了所使用的通道。

  • RT0,ARGB32格式:漫反射颜色(RGB),遮挡(A)。
  • RT1,ARGB32格式:高光颜色(RGB),粗糙度(A)。
  • RT2,ARGB2101010格式:世界坐标系下的法线(RGB),未使用(A)。
  • RT3,ARGB2101010(非HDR)或者ARGBHalf(HDR)格式:自发光+光照+光照贴图+反射探针缓冲区。
  • 深度+模板缓冲区。

因此默认的g-buffer布局占用 160 bits/pixel(非HDR)或者 192 bits/pixel(HDR)。

如果使用阴影遮罩或者距离阴影遮罩模式,那么还将会使用到第五个渲染目标:

  • RT4,ARGB32格式:灯光遮挡值(RGBA)。

因此g-buffer布局就是 192 bits/pixel(非HDR)或者224 bits/pixel(HDR)。

如果硬件不支持同时使用5个渲染目标,那么使用阴影遮罩的物体将会回退到前向渲染路径。当相机没有使用HDR时,自发光+光照缓冲区(RT3)采用对数编码来提供比常规ARGB32纹理更大的动态范围。

注意:当相机启用了HDR渲染,不会创建单独的渲染目标用于自发光+光照缓冲区(RT3),而是相机本身的渲染目标(也就是传递给图像特效的渲染目标)直接当作RT3使用。

G-Buffer pass

G-Buffer pass渲染每个GameObject一次。漫反射和高光颜色、表面粗糙度、世界坐标系法线以及自发光+环境光+反射+光照贴图这些都会渲染进g-buffer纹理里面。这些g-buffer纹理被设置成全局的着色器属性以方便后续的着色器访问(名字为 CameraGBufferTexture0 … CameraGBufferTexture3)

Lighting pass

光照pass根据g-buffer和深度计算光照。光照是在屏幕空间计算的,因此处理耗时与场景复杂度无关。光照结果将会添加到自发光缓冲区。

点灯和聚光灯的作用范围如果没有与相机的近截面相交,那么它们将会以3D形状渲染,渲染时开启深度缓冲区,检测与场景的遮挡顺序。这就使得部分或者完全遮挡的点灯和聚光灯的渲染开销非常小。方向光和作用范围与相机的近截面相交的点灯/聚光灯将以全屏的四边形渲染。

如果灯光开启了阴影,那么阴影将会在此pass进行渲染和应用。请注意,阴影是有代价的。阴影投射将会被用到,并且将会应用一个更加复杂的光照着色器。

可用的光照模型只有Standard。如果你需要一个不一样的光照模型,那么你需要一个修改版的Lighting pass着色器。具体步骤为:

  1. 复制内建着色器zip包里的 Internal-DeferredShading.shader 文件,并加以修改。
  2. 在Assets目录里创建Resources文件夹,并将修改过的着色器放进去。
  3. 打开Graphics设置面板(Edit > Project Settings > Graphics),改变 “Deferred” 下拉列表为 “Custom Shader”。
  4. 选择你自定义的着色器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值