Unity延迟渲染路径

本文为译文,译者:ferrilin,原文请查看 Wikipedia: deferred shading 获取技术概述

Overview

当使用延迟着色,那么可以作用在对象上的光照,将没有数量限制。所有光照都会被逐像素的评估,这意味着所有光照都可以正确的被法向贴图影响,等等。此外,每个光照都可以有cookie 和 shadow。

延迟着色的优点是光照的处理开销与被光照的像素数成正比。这由场景中光照的体积决定,不管有多少游戏对象被照亮。因此,保持小的光照,可以提升性能。Deferred shading 也有高一致性和可预见的表现。每个光照的影响被逐像素计算,因此在分解大三角时,没有光照计算。

在不好的方面,延迟着色没有真正支持抗锯齿,并且不能操作半透明游戏对象(它们会用 forward rendering)。它也不支持 Mesh Renderer 的 Receive Shadows 标记,并且culling masks只被有限制的支持。你最多只能使用4个culling masks。 也就是说,您的 culling masks层至少必须包含所有层除去四个任意层,因此必须设置32层中的28层。 否则您会得到错误的图形。

Requirements

它要求显卡支持 Multiple Render Targets (MRT), Shader Model 3.0 (or later) 并且支持 Depth render textures。

在手机上,延迟渲染是不被支持的,主要是由于MRT格式的使用 (一些支持MRT格式的显卡,仍然只支持有限的位数).

Note: 使用正投影时,延迟渲染不被支持。如果相机的投影模式被设置为 Orthographic 该相机会被后退到 forward shading。

Performance considerations(性能方面的考虑)

在延迟着色中,实时光照的渲染开销,是正比于被光照亮的像素数量的,而不取决于场景复杂度。因此小的点光源或放射光源的渲染是很廉价的,并且如果它们部分或全部被场景中的游戏对象遮挡,那么渲染代价会更加的廉价。

当然,有阴影的光照比没有阴影的光照开销更大。在延迟渲染中,有阴影的物体仍然需要为每个产生阴影的光源再渲染一次或多次。此外,提供阴影的光照着色比禁止阴影的着色有更高的开销。

Implementation details

在延迟渲染结束后被渲染的对象,不支持延迟渲染,会使用 forward rendering path.

默认的渲染目标(RT0 - RT4)布局在 geometry buffer (g-buffer) 如下列表。数据类型被放在每个渲染目标不同的渲染通道中。被使用的通道在圆括号内。

  •  RT0, ARGB32 format: Diffuse color (RGB), occlusion (A).
  •  RT1, ARGB32 format: Specular color (RGB), roughness (A).
  •  RT2, ARGB2101010 format: World space normal (RGB), unused (A).
  •  RT3, ARGB2101010 (non-HDR) or ARGBHalf (HDR) format: Emission + lighting + lightmaps + reflection probes buffer.
  •  Depth+Stencil buffer.

所以默认的 g-buffer 布局是 160 bits/pixel (non-HDR) 或 192 bits/pixel (HDR)。

如果为混合光照使用 Shadowmask 或 Distance Shadowmask 模式,第五个目标会被使用:

  •  RT4, ARGB32 format: Light occlusion values (RGBA).

因此 g-buffer 布局是 is 192 bits/pixel (non-HDR) 或 224 bits/pixel (HDR)。

如果硬件不支持同时五个渲染目标,那么使用 shadowmasks 的对象会被回退到 forward rendering path。 当摄像机不是HDR模式时Emission+lighting buffer (RT3) 是用对数编码来提供比平常 ARG32 texture 更大的动态范围。

注意当摄像机使用HDR模式渲染时,不会创建单独的 Emission+lighting buffer(RT3);取而代之的是相机的渲染目标(即,接受图形影响的对象)被用作RT3。

G-Buffer pass

G-buffer pass 渲染每个游戏对象一次。 漫反射和镜面反射, 表面光滑度, 世界空间法向, 和 emission+ambient+reflections+lightmaps 被渲染进 g-buffer 纹理中。G-buffer 纹理被设置为全局shader属性,提供给后来的shader访问 (CameraGBufferTexture0 .. CameraGBufferTexture3 names)。

Lighting pass

Lighting pass 计算光照基于g-buffer 和 depth。光照在屏幕空间被计算,所以计算过程取决于场景复杂度。光照会被添加到 emission buffer。

不通过相机近平面的电光源和放射光源被渲染为3D形状,当场景启用了 Z buffer的测试。这让部分或全部被遮挡的点光源或放射光源的渲染很廉价。 跨越近平面的平行光和点/放射光源,被渲染为全屏的四边形。

如果光源启用阴影,它们同样会被渲染和提供在该pass中。注意阴影不是“免费”的;产生阴影的物体需要被渲染并且必须提供一个更复杂的光照shader。

唯一可用的光照模型是Standard。如果需要一个不同的光照模型,你可以修改 lighting pass shader,通过放置修改过的 Internal-DeferredShading.shader 版本的文件来自 Built-in shaders 进入文件夹 “Resources” 在你的 “Assets” 文件夹。然后进入 Edit->Project Settings->Graphics 窗口。选择 “Deferred” 下拉菜单中的 “Custom Shader”。 然后配置您使用的 shader 的各种选项。

本文转自:CSDN,由博主 ferrilin 翻译,转载此文目的在于传递更多信息,版权归原作者所有。

推荐阅读