Version: 2020.3
延迟着色渲染路径
顶点光照渲染路径

旧版延迟渲染路径

本页面将详细介绍 Unity 内置渲染管线中的旧版延迟(光照预通道)渲染路径。有关延迟光照的技术概述,请参阅此文章

注意:从 Unity 5.0 开始,旧版延迟渲染路径被认为是旧版功能,因为它不支持某些渲染功能(例如标准着色器、反射探针)。新项目应考虑改用延迟着色渲染路径。

注意:使用正交投影 (Orthographic projection) 时不支持延迟渲染。如果摄像机的投影模式设置为正交模式,则摄像机将始终使用前向渲染。

概述

使用延迟光照时,可影响对象的光源数量没有限制。所有光源都按像素进行评估,这意味着它们都能与法线贴图等正确交互。此外,所有光源都可以有剪影和阴影。

延迟光照的优点是,光照的处理开销与接受光照的像素数成正比。这取决于场景中的光量大小,而不管接受光照的对象有多少。因此,可通过减少光源数量来提高性能。延迟光照还具有高度一致和可预测的行为。每个光源的效果都是按像素计算的,因此不会有在大三角形上分解的光照计算。

在缺点方面,延迟光照并不支持抗锯齿,也无法处理半透明对象(这些对象将使用前向渲染进行渲染)。此外,它也不支持网格渲染器 (Mesh Renderer) 的接受阴影 (Receive Shadows) 标志,并且仅在有限程度上支持剔除遮罩。最多只能使用四个剔除遮罩。也就是说,剔除层遮罩必须至少包含所有层减去四个任意层,即必须设置 32 个层中的 28 个层。否则,将产生图形瑕疵。

要求

延迟光照要求显卡具有着色器模型 3.0(或更高版本)、支持深度渲染纹理以及具有双面模板缓冲区。 2004 年以后制造的大多数 PC 显卡都支持延迟光照,包括 GeForce FX 及更高版本、Radeon X1300 及更高版本、 Intel 965/GMA X3100 及更高版本。在移动端,所有支持 OpenGL ES 3.0 的 GPU 都支持延迟光照,而一部分 支持 OpenGL ES 2.0 的 GPU 也支持延迟光照(即支持深度纹理的 GPU)。

性能注意事项

The rendering overhead of realtime lights in deferred lighting is proportional to the number of pixels illuminated by the light and is not dependent on scene complexity. So small Point Lights or Spot Lights are very cheap to render and if they are fully or partially occluded by scene objects then they are even cheaper.

当然,有阴影的光源比没有阴影的光源的成本高得多。在延迟光照中,对于每个阴影投射光源,仍然需要将投射阴影的对象渲染一次或多次。此外,应用阴影的光照着色器的渲染开销高于禁用阴影时的渲染开销。

实现详细信息

使用延迟光照时,Unity 中的渲染过程在三个通道中进行:

1.基础通道:渲染对象以生成具有深度、法线和镜面反射能力的屏幕空间缓冲区。 1.光照通道:将先前生成的缓冲区用于计算光照以进入另一个屏幕空间缓冲区。 1.最终通道:再次渲染对象。它们会获取计算出的光照,将其与颜色纹理相结合,并添加环境/发射光照。

如果对象的着色器无法处理延迟光照,则会在此过程结束后使用前向渲染路径来渲染这些对象。

基础通道

基础通道将每个对象渲染一次。视图空间法线和镜面反射能力将渲染到单个 ARGB32 渲染纹理中(法线位于 RGB 通道中,而镜面反射强度位于 A 通道中)。如果平台和硬件允许将 Z 缓冲区作为纹理读取,则不会显式渲染深度。如果无法将 Z 缓冲区作为纹理访问,则会使用着色器替换在另外的渲染通道中渲染深度。

基础通道的结果是填充了场景内容的 Z 缓冲区以及包含法线和镜面反射能力的渲染纹理。

光照通道

光照通道根据深度、法线和镜面反射能力来计算光照。光照是在屏幕空间内计算的,因此处理所需的时间与场景复杂性无关。光照缓冲区是单个 ARGB32 渲染纹理,其中在 RGB 通道中包含漫射光照,而在 A 通道中包含单色镜面光照。光照值采用对数编码,因此提供的动态范围高于 ARGB32 纹理通常可能提供的范围。如果摄像机启用了 HDR 渲染,则光照缓冲区为 ARGBHalf 格式,并且不执行对数编码。

Point Lights and Spot Lights that do not cross the camera’s near plane are rendered as (front faces of) 3D shapes, with the depth test against the scene enabled. Lights crossing the near plane are also rendered using 3D shapes, but as back faces with inverted depth test instead. This makes partially or fully occluded lights very cheap to render. If a light intersects both far and near camera planes at the same time, the above optimizations cannot be used, and the light is drawn as a tight quad with no depth testing.

以上说明不适用于方向光;方向光总是渲染为全屏四边形。

如果光源启用了阴影,那么也会在此通道中渲染并应用阴影。请注意,阴影并非是“无成本”的;需要渲染阴影投射物,并且必须应用更复杂的光照着色器。

唯一可用的光照模型是 Blinn-Phong。如果需要不同的模型,可修改光照通道着色器,方法是将内置着色器中的 Internal-PrePassLighting.shader 文件的修改版本放入“Assets”文件夹中名为“Resources”的文件夹内。然后,选择 Edit > Project Settings > Graphics 窗口。将“Legacy Deferred”下拉选单改为“Custom Shader”。然后,更改当前使用的光照着色器对应的着色器 (Shader) 选项。

最终通道

最终通道将产生最终渲染的图像。在此阶段将再次使用着色器渲染所有对象,这些着色器会获取光照,将其与纹理相结合,并添加发射光照。在最终通道中还会应用光照贴图。在靠近摄像机的位置将使用实时光照,并且仅添加烘焙间接光照。因此会交叉淡入远离摄像机的完全烘焙光照。

延迟着色渲染路径
顶点光照渲染路径