本文已参加「新人创造礼」活动,一同开启创造之路。

本篇为Unity官方文档的摘抄集合,为方便后续翻看。

Unity 的内置烘托管线支撑不同烘托途径。烘托途径是与光照和暗影相关的一系列操作。不同的烘托途径具有不同功用和功用特征。应依据项目类型以及方针硬件,挑选烘托途径。

可在 Graphics 窗口中挑选项目运用的烘托途径,并可为每个摄像机覆盖该途径。

如果运转项目的设备上的 GPU 不支撑所选的烘托途径,则 Unity 将主动运用较低保真度的烘托途径。例如,在无法处理推迟上色的 GPU 上,Unity 运用前向烘托。

1、前向烘托

前向烘托是内置烘托管线中的默许烘托途径。这是通用的烘托途径。

1.1 简介

选用前向烘托办法烘托实时光源会非常消耗资源。为了抵消此本钱,能够挑选 Unity 在任何一个时刻应该为每个像素烘托的光源数量。Unity 会以较低保真度烘托场景中的其他光源:每个极点或每个方针。

如果项目没有运用很多实时光源,或者光照保真度对项目而言不重要,则此烘托途径可能是这个项目的不错挑选。

前向烘托依据影响方针的光源在一个或多个通道中烘托每个方针。光源自身也能够通过前向烘托进行不同的处理,详细取决于它们的设置和强度。

1.2 完成详细信息

在前向烘托中,影响每个方针的一些最亮的光源以彻底逐像素光照形式烘托。然后,最多 4 个点光源选用每极点核算办法。其他光源以球谐函数 (SH) 核算,这种核算办法会快得多,但仅得到近似值。

光源是否为每像素光源依据以下原则而定:

  • Render Mode 设置为 Not Important 的光源一直为每极点或 SH 光源。
  • 最亮的方向光一直为每像素光源。
  • Render Mode 设置为 Important 的光源一直为每像素光源。
  • 如果上述情况导致光源数少于当时的 Pixel Light Count 质量设置,则按照亮度下降的次序,更多光源选用每像素烘托办法。
  • 每个方针的烘托按如下办法进行:
  • 根底通道运用一个每像素方向光和一切每极点/SH 光源。
  • 其他每像素光源在额定的通道中烘托(每个光源对应一个通道)。

例如,如果某个方针遭到许多光源的影响(下图中的圆形受光源 A 到 H 的影响):

Unity-TA 成长之路(二)内置渲染管线-官方篇 - 渲染路径

让我们假设光源 A 到 H 具有相同的色彩和强度,而且一切光源都具有主动烘托形式,因而它们将严厉按照此方针的以下次序排序。最亮的光源将以每像素光照形式烘托(A 到 D),然后最多 4 个光源以每极点光照形式烘托(D 到 G),最后其他光源以 SH 进行烘托(G 到 H):

Unity-TA 成长之路(二)内置渲染管线-官方篇 - 渲染路径

光源组会重叠,例如,最后一个每像素光源混合到每极点光照形式,因而当方针和光源移动时,“光射量”(light popping) 较少。

1.3 根底通道

根底通道运用一个每像素方向光和一切 SH/每极点光源来烘托方针。此通道还会增加上色器中的一切光照贴图、环境光照和发射光照。在此通道中烘托的方向光能够具有暗影。请注意,光照贴图的方针不会从 SH 光源获得光照。

在上色器中运用“OnlyDirectional”通道标志时,前向根底通道仅烘托主方向光、环境光/光照探针和光照贴图(SH 和极点光源不包括在通道数据中)。

1.4 其他通道

关于影响此方针的每个额定的每像素光源,需求额定的烘托通道。默许情况下,这些通道中的光源没有暗影(因而在结果中,前向烘托支撑一个带暗影的方向光),除非运用 multi_compile_fwdadd_fullshadows 变体快捷办法。

1.5 功用注意事项

球谐函数光源的烘托速度_很_快。这些光源的 CPU 本钱很低,而且运用 GPU 的_本钱基本为零_(也就是说,根底通道一直会核算 SH 光照;但由于 SH 光源工作办法的原因,不管 SH 光源有多少,本钱都彻底相同)。

SH 光源的缺陷:

  • 按方针的极点而不是按像素核算。这意味着它们不支撑光照剪影和法线贴图。
  • SH 光照的频率很低。SH 光源无法完成快速的光照过渡。它们也只影响漫射光照(频率对镜面高光而言太低)。
  • SH 光照不是部分光照;SH 点光源或聚光灯在接近某种外表时“看起是过错的”。

总的来说,SH 光源一般足以到达小型动态方针的光照要求。

2、推迟上色

推迟上色是内置烘托管线中具有最大光照和暗影保真度的烘托途径。

推迟上色需求 GPU 支撑,而且有一些局限性。这种上色办法不支撑半透明方针(Unity 运用前向烘托来烘托这些方针)、正交投影(Unity 对这些摄像机运用前向烘托)或硬件抗锯齿(但能够运用后期处理作用来获得相似结果)。推迟上色对除掉遮罩的支撑有限,并会将 Renderer.receiveShadows 标志一直视为 true。

如果项目具有很多的实时光源并需求高等级的光照保真度,而方针硬件支撑推迟上色,那么此烘托途径关于该项目而言可能是一个不错的挑选。

2.2 概述

运用推迟上色时,可影响游戏方针的光源数量没有限制。一切光源都按像素进行评价,这意味着它们都能与法线贴图等正确交互。此外,一切光源都能够有剪影和暗影。

推迟上色的长处是,光照的处理开支与承受光照的像素数成正比。这取决于场景中的光量大小,而不管承受光照的游戏方针有多少。因而,可通过削减光源数量来进步功用。推迟上色还具有高度一致和可猜测的行为。每个光源的作用都是按像素核算的,因而不会有在大三角形上分化的光照核算。

在缺陷方面,推迟上色并不支撑抗锯齿,也无法处理半透明游戏方针(这些方针运用前向烘托进行烘托)。此外,它也不支撑网格烘托器 (Mesh Renderer) 的承受暗影 (Receive Shadows) 标志,而且仅在有限程度上支撑除掉遮罩。最多只能运用四个除掉遮罩。也就是说,除掉层遮罩有必要至少包括一切层减去四个恣意层,即有必要设置 32 个层中的 28 个层。不然,会发生图形瑕疵。

2.3 要求

推迟上色要求显卡具有多烘托方针 (MRT)、上色器模型 3.0(或更高版别)并支撑深度烘托纹路。从 GeForce 8xxx、Radeon X2400、Intel G45 开端,2006 年今后制造的大多数 PC 显卡都支撑推迟上色。

一切至少运转 OpenGL ES 3.0 的移动设备都支撑推迟上色。

注意: 运用正交投影 (Orthographic projection) 时不支撑推迟烘托。如果摄像机的投影形式设置为正交形式,则摄像机将回退到前向烘托。

2.4 功用注意事项

推迟上色中的实时光源的烘托开支与承受光照的像素数成比例,并_不_依赖于场景复杂度。所以小型点光源或聚光灯的烘托本钱非常低,如果它们被场景游戏方针彻底或部分遮挡,那么本钱乃至更低。

当然,有暗影的光源比没有暗影的光源的本钱高得多。在推迟上色中,关于每个暗影投射光源,依然需求将投射暗影的游戏方针烘托一次或屡次。此外,运用暗影的光照上色器的烘托开支高于禁用暗影时的烘托开支。

2.5 完成详细信息

如果方针的上色器不支撑推迟上色,则会在推迟上色完毕后运用前向烘托途径来烘托这些方针。

下面列出了 G 缓冲区中烘托方针 (RT0 – RT4) 的默许布局。数据类型放置在每个烘托方针的各个通道中。运用的通道显示在括号内。

  • RT0,ARGB32 格局:漫射色彩 (RGB),遮挡 (A)。
  • RT1,ARGB32 格局:镜面反射色彩 (RGB),粗糙度 (A)。
  • RT2,ARGB2101010 格局:世界空间法线 (RGB),未运用 (A)。
  • RT3,ARGB2101010(非 HDR)或 ARGBHalf (HDR) 格局:发射 + 光照 + 光照贴图 + 反射探针缓冲区。
  • 深度+模板缓冲区。

因而,默许的 G 缓冲区布局为 160 位/像素(非 HDR)或 192 位/像素 (HDR)。

如果混合光照形式为 Shadowmask 或 Distance Shadowmask,则运用第五个方针:*RT4,ARGB32 格局:光照遮挡值 (RGBA)。

因而,G 缓冲区布局为 192 位/像素(非 HDR)或 224 位/像素 (HDR)。

如果硬件不支撑五个并发烘托方针,则运用暗影遮罩的方针将回退到前向烘托途径。 当摄像机不运用 HDR 时,发射+光照缓冲区 (RT3) 选用对数编码,因而供给的动态规模高于 ARGB32 纹路一般可能供给的规模。

当摄像机运用 HDR 烘托时,不会为发射 + 光照缓冲区 (RT3) 创立单独的烘托方针;而是将摄像机烘托到的烘托方针(即传递给图画作用的烘托方针)用作 RT3。

2.6 G缓冲区通道

G 缓冲区通道将每个游戏方针烘托一次。漫射和镜面反射色彩、外表滑润度、世界空间法线和发射+环境+反射+光照贴图都将烘托到 G 缓冲区纹路中。G 缓冲区纹路设置为全局上色器特点供上色器今后拜访(_CameraGBufferTexture0 .._CameraGBufferTexture3 指定)。

2.7 光照通道

光照通道依据 G 缓冲区和深度来核算光照。光照是在屏幕空间内核算的,因而处理所需的时刻与场景复杂性无关。光照将增加到发射缓冲区。

不与摄像机近平面相交的点光源和聚光灯将烘托为 3D 形状,并会启用 Z 缓冲区对场景的测验。因而,部分或彻底遮挡的点光源和聚光灯的烘托本钱很低。方向光以及与近平面相交的点光源/聚光灯将烘托为全屏四边形。

如果光源启用了暗影,那么也会在此通道中烘托并运用暗影。请注意,暗影并非是“无本钱”的;需求烘托暗影投射物,而且有必要运用更复杂的光照上色器。

仅有可用的光照模型是规范 (Standard) 光照模型。如果需求不同的模型,可修正光照通道上色器,办法是将内置上色器中的 Internal-DeferredShading.shader 文件的修正版别放入“Assets”文件夹中名为“Resources”的文件夹内。然后翻开 Graphics 设置(菜单:Edit > Project Settings,然后单击 Graphics 类别)。将“Deferred”下拉选单改为“Custom Shader”。然后,更改当时运用的上色器对应的上色器 (Shader) 选项。

3、旧版推迟 (Legacy Deferred)

旧版推迟(光照预通道) 相似于推迟上色,只是选用不同的技能并进行不同的折中。它不支撑 Unity 5 根据物理的规范上色器。

从 Unity 5.0 开端,旧版推迟烘托途径被认为是旧版功用,由于它不支撑某些烘托功用(例如规范上色器、反射探针)。新项目应考虑改用推迟上色烘托途径。运用正交投影 (Orthographic projection) 时不支撑推迟烘托。如果摄像机的投影形式设置为正交形式,则摄像机将一直运用前向烘托。

3.1 概述

运用推迟光照时,可影响方针的光源数量没有限制。一切光源都按像素进行评价,这意味着它们都能与法线贴图等正确交互。此外,一切光源都能够有剪影和暗影。

推迟光照的长处是,光照的处理开支与承受光照的像素数成正比。这取决于场景中的光量大小,而不管承受光照的方针有多少。因而,可通过削减光源数量来进步功用。推迟光照还具有高度一致和可猜测的行为。每个光源的作用都是按像素核算的,因而不会有在大三角形上分化的光照核算。

在缺陷方面,推迟光照并不支撑抗锯齿,也无法处理半透明方针(这些方针将运用前向烘托进行烘托)。此外,它也不支撑网格烘托器 (Mesh Renderer) 的承受暗影 (Receive Shadows) 标志,而且仅在有限程度上支撑除掉遮罩。最多只能运用四个除掉遮罩。也就是说,除掉层遮罩有必要至少包括一切层减去四个恣意层,即有必要设置 32 个层中的 28 个层。不然,将发生图形瑕疵。

3.2 要求

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

3.3 功用注意事项

推迟光照中的实时光源的烘托开支与承受光照的像素数成比例,并_不_依赖于场景复杂度。所以小型点光源或聚光灯的烘托本钱非常低,如果它们被场景方针彻底或部分遮挡,那么本钱乃至更低。

当然,有暗影的光源比没有暗影的光源的本钱高得多。在推迟光照中,关于每个暗影投射光源,依然需求将投射暗影的方针烘托一次或屡次。此外,运用暗影的光照上色器的烘托开支高于禁用暗影时的烘托开支。

3.4 完成详细信息

运用推迟光照时,Unity 中的烘托进程在三个通道中进行:

(1)根底通道:烘托方针以生成具有深度、法线和镜面反射才能的屏幕空间缓冲区。

(2)光照通道:将从前生成的缓冲区用于核算光照以进入另一个屏幕空间缓冲区。

(3)终究通道:再次烘托方针。它们会获取核算出的光照,将其与色彩纹路相结合,并增加环境/发射光照。

如果方针的上色器无法处理推迟光照,则会在此进程完毕后运用前向烘托途径来烘托这些方针。

3.5 根底通道

根底通道将每个方针烘托一次。视图空间法线和镜面反射才能将烘托到单个 ARGB32 烘托纹路中(法线坐落 RGB 通道中,而镜面反射强度坐落 A 通道中)。如果渠道和硬件允许将 Z 缓冲区作为纹路读取,则不会显式烘托深度。如果无法将 Z 缓冲区作为纹路拜访,则会运用上色器替换在别的的烘托通道中烘托深度。

根底通道的结果是填充了场景内容的 Z 缓冲区以及包括法线和镜面反射才能的烘托纹路。

3.6 光照通道

光照通道依据深度、法线和镜面反射才能来核算光照。光照是在屏幕空间内核算的,因而处理所需的时刻与场景复杂性无关。光照缓冲区是单个 ARGB32 烘托纹路,其间在 RGB 通道中包括漫射光照,而在 A 通道中包括单色镜面光照。光照值选用对数编码,因而供给的动态规模高于 ARGB32 纹路一般可能供给的规模。如果摄像机启用了 HDR 烘托,则光照缓冲区为 ARGBHalf 格局,而且不执行对数编码。

不与摄像机近平面相交的点光源和聚光灯将烘托为 3D 形状(的正面),并会启用对场景的深度测验。与近平面相交的光源也用 3D 形状进行烘托,但作为背面并进行反向深度测验。因而,部分或彻底遮挡的光源的烘托本钱很低。如果光源一起与摄像机的远平面和近平面相交,则不能运用上述优化,而光源会被绘制为严密四边形而且不进行深度测验。

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

如果光源启用了暗影,那么也会在此通道中烘托并运用暗影。请注意,暗影并非是“无本钱”的;需求烘托暗影投射物,而且有必要运用更复杂的光照上色器。

仅有可用的光照模型是 Blinn-Phong。如果需求不同的模型,可修正光照通道上色器,办法是将内置上色器中的 Internal-PrePassLighting.shader文件的修正版别放入“Assets”文件夹中名为“Resources”的文件夹内。然后,挑选 Edit > Project Settings > Graphics 窗口。将“Legacy Deferred”下拉选单改为“Custom Shader”。然后,更改当时运用的光照上色器对应的上色器 (Shader) 选项。

3.7 终究通道

终究通道将发生终究烘托的图画。在此阶段将再次运用上色器烘托一切方针,这些上色器会获取光照,将其与纹路相结合,并增加发射光照。在终究通道中还会运用光照贴图。在接近摄像机的位置将运用实时光照,而且仅增加烘焙直接光照。因而会交叉淡入远离摄像机的彻底烘焙光照。

4、旧版极点光照

旧版极点光照 (Legacy Vertex Lit) 是具有最低光照保真度且不支撑实时暗影的烘托途径。这是前向烘托途径的子集。

极点光照途径一般在一个通道中烘托每个方针,并为每个极点核算一切光源的光照。

极点光照途径是最快的烘托途径,具有最广泛的硬件支撑。

由于一切光照都是在极点等级核算的,因而该烘托途径不支撑大多数每像素作用:暗影、法线贴图、光照剪影和高度细节化的镜面高光都不受支撑。

高光都不受支撑。

5、烘托途径比较

推迟 前向 旧版推迟 极点光照
功用
每像素光照(法线贴图、光照剪影)
实时暗影 带有警告
反射探针
深度和法线缓冲区 其他烘托pass
软粒子
半透明方针
抗锯齿
光照除掉遮罩 受限 受限
光照保真度 全部每像素 部分每像素 全部每像素 全部每极点
功用
每像素光照的本钱 照耀像素数量 像素数量 * 照耀方针数量 照耀像素数量
正常烘托方针的次数 1 每像素光照的数量 2 1
简略场景的开支
渠道支撑
PC (Windows/Mac) Shader Model 3.0+ 和 MRT 一切 Shader Model 3.0+ 一切
移动端 (iOS/Android) OpenGL ES 3.0 和 MRT、Metal(在搭载 A8 或更高版别 SoC 的设备上) 一切 OpenGL ES 2.0 一切
游戏主机 XB1、PS4 一切 XB1、PS4、360