Unity延迟渲染路径(Deferred shading rendering path)

25 篇文章 0 订阅
25 篇文章 0 订阅

Deferred shading rendering path

该文字详述延迟着色 rendering path. 查看 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。大部分2006年后执着的PC显卡支持延迟着色,它们的开头为 GeForce 8xxx, Radeon X2400, Intel G45.

在手机上,延迟渲染是不被支持的,主要是由于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)。

如果为混合光照使用 ShadowmaskDistance 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 的各种选项。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值