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

旧版延迟渲染路径

本页面将详细介绍 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)。

性能注意事项

延迟光照中的实时光源的渲染开销与接受光照的像素数成比例,并_不_依赖于场景复杂度。所以小型点光源或聚光灯的渲染成本非常低,如果它们被场景对象完全或部分遮挡,那么成本甚至更低。

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

实现详细信息

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

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

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

基础通道

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

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

光照通道

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

不与摄像机近平面相交的点光源和聚光灯将渲染为 3D 形状(的正面),并会启用对场景的深度测试。与近平面相交的光源也用 3D 形状进行渲染,但作为背面并进行反向深度测试。因此,部分或完全遮挡的光源的渲染成本很低。如果光源同时与摄像机的远平面和近平面相交,则不能使用上述优化,而光源会被绘制为紧密四边形并且不进行深度测试。

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

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

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

最终通道

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

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