Unity3D的全局光照及Lighting Window面板参数简介

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

1 什么是全局光照(Global Illumination)

在阐述什么是全局光照之前,我们先简与之对应的局部光照。粗略地说,所谓局部光照,就是我们在渲染一个场景时,仅仅考虑光源和物体之间的交互,而不考虑物体与物体之间的光线交互——即每一个物体表面的颜色,仅仅由光源发出的光线贡献,而不考虑由其他物体所反射过来的光线的贡献。

全局光照则是在局部光照的基础上,增加考虑物体与物体之间光线交互。所以说如果局部光照系统就是由光源+待渲染物体+视点组成的话,那么全局光照系统就是由光源+各待渲染物体之间的反射光+待渲染物体+视点组成。

从是否是即时性来分,GI可分为实时(又可称为在线)光照非实时(又可称为离线) 光照。如果是离线光照的话,待渲染物体之间的反射光就是通过辐射度算法或者是光线追踪算法逐点计算出来的。这些算法是相当耗时的,无法应用在实时GI上(当然随着硬件的发展,不排除原本只适用于离线光照的算法在未来能应用在实时上)。

2 光照的各种方式

如上所述,GI是在局部光照的基础上,增加了对待渲染物体之间的光线交互的计算。从而使得渲染效果更逼真。对Unity3D而言。照明模式(lighting mode)分为实时照明和烘焙照明两大类,其中烘焙照明又可以分为预计算光照和烘焙光照贴图这两种。首先看实时照明的方式。

2.1 实时照明

在不做任何修改设置的情况下,Unity的光源(包括directional light,、spot light、point light)都是实时的,代表这些光源会把光线照射到场景并以每一帧的频率更新,由于光源是可以在场景内移动的对象,场景灯光的更新是实时的,你可以在游戏窗口和场景窗口看到改变。如下图

注意上图:因为没有反射光源的关系阴影是全黑的,只有投射光锥体范围内的对象表面才有光源影响。实时照明是场景里照亮物体最基本的方法,用来照亮角色和会动的对象,但默认设置里Unity实时照明里的光线不会反射,(也就是说,从A物体反射出来的光线,就算是在物理学上应该会入射到B物体。但在渲染中,计算B物体的最终颜色时,并不考虑这个从A物体反射过来的光线的贡献)。因此,我们才导入了全局光照系统,启用了预先计算的技术,都是为了表现一个更逼真的场景。

2.2 烘焙照明

2.2.1 烘焙全局光照贴图(Baked GI Lighting)

当烘焙一张光照贴图(Lightmap)时,场景内的静态对象会根据当前场景内的光照,算出一张渲染结果贴图,并覆盖在场景对象之上建立照明效果,如下图:

这些”光照贴图”可以包含场景内投射到物体表面的直接光源,以及在不同物体间反射的”间接光源”,这样的光照贴图可以通过使用着色器(Shader)描述物体的表面信息(Albedo)和凹凸(Normals)信息。

使用这种烘焙方式所产生出来的光照贴图,是无法在运行期发生变化的,因此被定义为静态(Static),虽然仍可在这层贴图上继续迭加光源计算,但两者已无法交互运算,通常我们采用这光照法来让低阶的手机能顺利执行,解决光在游戏中运行的性能问题。

2.2.2预计算全局光照(Precomputed Realtime GI Lighting)

虽然这种静态光照贴图无法在游戏执行时改变场景光照效果,但预先计算的实时全局光照系统,则能实时地去计算算复杂的场景光源的变化,通过这种方法,就能建立一个丰富的全局光照反射场景,并实时反映光源的改变。好比做个日晷,阴影的位置和颜色会随着光源移动改变,这在原本的烘焙光照系统是无法达成的。

为了能够实时地实现这些效果,需要在实时运算之前先将场景中的相关光照数据做一次”预计算”,所谓的预计算负责计算游戏过程中光的复杂行为,它可以在时间空档时进行计算,因此称作一个”脱机”运算,或者可称为“离线”运算。

3 Unity3D 5中的全局烘焙照明

在上节我们提到Unity3D 5的GI系统有两种烘焙模式,因此,Unity3D 5在Lighting Windows窗口中提供了这两种的模式的操作。 Unity3D 5的Lighting Window可以在通过菜单【Windows|Lighting】打开。

在Unity3D 5的灯光组件中,有一个Baking属性,这个Baking属性有三种选项,分别是Realtime、Baked、Mixed这三种属性。而这三种属性,则又分别对应于Lighting Window中的Scene Tab界面中的【Precomputed Realtime GI】和【Baked GI】这两个选项的组合,如下图

3.1只勾选【Precomputed Realtime GI】选项

关闭当在scene tab面板中,关闭了【Baked GI】选项。或者将场景中的全部光源类型设置为【Realtime】的时候这意味着没有任何的光会被预先烘焙出光照贴图。引擎在“烘焙”时,仅仅是存储场景内静态物体间的关系,当烘焙完成后你可以自由的调整光源或物体材质,并实时地看到效果。 此时在Scene中观察Baked结果可以看到没有任何静态颜色被烘焙出来。

如果在scene tab中,仅启用了【Precomputed Realtime GI】选项时,则场景中的光源应该选择Realtime类型。烘焙选项【Realtime Resolutio】对应前文所说的间接光照图,值越高间接光的效果就越明显(其实应该是越准确,当分辨率太低时间接光会因像素过滤而变弱) 。如下图,注意红色盒子投递在白色盒子上的影子。如下图当Realtime Resolution的值为10时

如下图当Realtime Resolution的值为1时

3.2 只勾选【Baked GI】选项

当在scene tab中,取消【Precomputed Realtime GI】选项,而启用【Baked GI】的话。这时候光源则依赖于他的Baking属性去分别参与静态光照贴图的烘焙:属性为Realtime的灯光,不参与静态光照烘焙,但同时作用于动态与静态物体上;属性为Mixed的光源,参与静态光照贴图的烘焙,而在运行时,则仅作用于非静态物体;属性为Baked光源,仅作用于静态光照贴图的烘焙,在运行时不参与实时光照计算。如下图可再次观察SceneView可以看到烘焙出来的颜色。

如果使用纯Static Lightmap烘焙时会有一个Indirection Resolution的设置,这个设置就对应于Precomputed Realtime GI中的Realtime Resolution,同样是控制间接光的影响,产生的效果是一样的。

3.3 同时勾选【Baked GI】和【Precomputed Realtime GI】选项

如果同时在scene面板上勾选【Baked GI】与【Precomputed RealtimeGI】的话,首先,光源产生的光照以及物体间的反射光线,都会被预先直接烘焙在静态光照贴图上,因此,前文所提使用GI可以自由实时调整光源或是物体材质的效果,在这种烘焙模式下都是没有用的,但是自发光材质以及天空光产生的辐射光线在这种模式下仍然是可以实时变化,并叠加作用于已烘焙的颜色上。 下图是光照烘焙颜色信息

下图是辐射度信息:

最终合成颜色如下图:

辐射度信息图中除了自发光的红色外还有一点点靛青色,这是天空盒产生的颜色,在Environment Lighting中调整Ambient Intensity可以控制天空盒对场景整体明暗的影响。总的来说主体颜色还是静态烘焙出来的Lightmap控制,但是增加了GI中的动态天空光和自发光。总的来说不建议使用这种方式进行场景渲染,又消耗了静态Lightmap和GI所需的内存,又消耗了GI的计算资源,效果还不如单个使用的好。

GI最大的好处是可以让美术实时的看到使用Lightmap烘焙后的场景效果,也就是说首先关闭Baked GI仅烘焙一些Precomputed Realtime GI,随后美术就可以随意的调整光源、物体材质、天空盒等数值并实时观察到场景的最终效果,最后当一切都满意后关闭【Precomputed Realtime GI】,使用【Baked GI】进行光照贴图的烘焙即可。

4 Unity3D 5的Lighting Window面板

Lighting Window是Unity中对全局光影进行操作设置(Global Illumination)的主控制面板。尽管Unity的GI的默认设置已经能达到很好的效果,这个主控制面板上的参数可以允许你调整GI的各方面的属性,从而定制你的场景观感,或者优化你的场景质量、加载速度以及所需的存储空间等等。本控制面板也包含了如环境光(ambient light),光晕(halos)、cookie和雾(fog)等等的相关操作。这些操作在5.0之前的U3D,是在【Render Setting】面板下。

Lighing window分为三个标签面板。分别是:

Object标签面板允许你选择场景中的object的一部分,进而改变他们的设置。对于我们要指定哪些object将会分摊到GI计算中;以及把一些设置操作直接作用到某一分组的所有object中的情况。这种“允许选择部分object”的操作是很有用的。

Scene标签面板包含了若干设置。这些设置将会作用到整个场景,而不是仅仅作用到单独的物体。这些设置将会控制光照的效果(lighting effects),同时也包含了一些优化操作选项。

无论选择了哪个标签面板。面板的底部都有一个“自动检查框”选项以供勾选。如果勾选了该选项。当你编辑场景的时候,对应的光照图数据会自动对应更新。当然,你会注意到这个更新操作通常会花若干秒时间而不是离开就更新完毕。如果不勾选此项。则该“自动检查框”右边的【Build】按钮将被激活可用。当你需要根据你对场景的修改对应更新光照图时,点击该按钮就可以进行更新。【Build】按钮有一个下拉菜单。其中一个选项【clear the baked】可以清理旧的烘焙出来的光照图数据(不会清理对应的GI缓存数据)。

自动检查框下面有一个小面板,面板上显示一些光照图的相关统计信息。

4.1 Object Tab

Object标签面板可以让你选择一组object。然后对这一组object进行设置。

标签顶部的上面有一系列【Scene Filter】按钮:【All】、【Lights】、【Renderers】、【Terrain】。当点击【All】之外这些按钮时,会在Unity3D的Hierarchy窗口中过滤出不同类型的object。点击【All】按钮的话Hierarchy窗口则和平时一样。

要注意这些过滤器是不影响当前选择中的object的。这就好比如当前一个terrain object被选中的时候。点击【Lights】按钮,Hierarchy窗口就仅仅显示灯光object。

4.1.1 Light Tab

对于一个选中的灯光object而言。在这里的界面上显示的内容,本质上是和一个标准的灯光组件在inspector面板中显示的信息,是一样的。对GI有影响的属性,是界面中的【Baking】和【Bounce Intensity】两个选项。

Baking选项允许你选择场景中的灯光是否要被烘焙。如果选中【Baked】选项,表示烘焙灯光。选中【Mixed】选项也会进行烘焙。但对于一个非静态的game object。则在运行期依然会给他作用一个实时的方向光(directing lighting)。Realtime则工作在使用了“Precomputed Realtime”(译注:即“预计算实时”,注意和预烘焙的概念不一样)全局光照和不使用全局光影两种场合。

Bounce Intensity将允许你改变一个indirect light(译注:非直射光,即例如有一束光线,从一个物体,通过反射,射向另一个物体,这样子通过若干次反射/折射的光,就称为非直射光)的亮度。这个bounce intensity一般是一个由GI系统计算出来的默认值的倍数。如果你设置了bounce intensity的值,比1大的话,这些非直射光就会变得比用GI系统计算出来的效果更亮一些。如果设置得比1小的话,则变暗。这个功能是很有用。例如,当一个在阴影中的黑色表面,需要在渲染时调亮一些,才能看到一些细节。或者作为另外一种选择。如果你想使用预计算实时GI,但却又想限制某一个灯,只会发出一个直射光的效果(译注:也即它发出的光,不会在各物体之间反射/折射传递)。则把这个灯的bounce intensity设置为0即可。(译注:顾名思义,bounce这个单词的字面意思就是反弹,携带着能量的光线,我们将其看成像小球一样的光子,它不在各个物体之间传播反弹了,自然就是把反弹次数设置为0)

4.1.2 Renderers

对于渲染器而言,下面的属性是可用的:

属性 功能
Lightmap Static 这个选项如果勾选了,表明告诉挂接了本mesh renderer的game object是固定不移动的。可以交给GI系统去进行参与计算。如果不勾选。这个物体也可以通过Light Probes去照亮它
Scale in Lightmap 这个参数值指明了使用光照贴图纹理中的多少个像素去作用在这个game object上。缺省值是1.0.当值为1.0的时候意味着这个game object使用的光照贴图像素数量仅仅依赖于该object的表面大小。(也即整个object的每个单位表面积用了多少像素,这里就用多少像素)。如果大于1.0,则表示增加使用的像素(也即会增大光照贴图的分辨率)。小于1.0时则减少使用的分辨率。通过调整此属性,可以优化光照贴图,使得一些重要的细节区域可以显示得更为精确。例如:一栋单独的建筑,较为平坦的灰暗的墙壁,因为视觉效果比较模糊,所以可以使用低值(小于0),而一些彼此靠在一起的五颜六色的摩托车则可以使用一个高值。
Preserve UVs Unity可以重新计算该object所使用的实时光照贴图的UV坐标。从而提高性能。但请注意。有时候,对于一些原本就是不连续的UV坐标。这个重计算操作会发生错误。例如:一个原本我们特意去设计的锐利的边缘。重计算操作可能会误判断为这是一个平滑连续的表面。因此当勾选本项时,这个object原本的光照贴图UV坐标值(lightmapping UV)值,将会原样地转换到光照贴图中,以保留美术师原本想要的效果。如果本项不勾选的话。Unity将会依据“被烘焙过的UV值”(baked UV)去计算实时光照贴图UV,以便能够尽可能地把一些邻接的“光照贴图碎片”(chart)连接在一起并压缩。这个计算将会基于下面的两个设置:最大距离(max distance)和最大角度(max angle)。这些“光照贴图碎片”,每一个碎片将会由一个“半像素边界”(half pixel border )包围着它。以确保在渲染时不会遗漏错漏。
Auto UV Max Distance 当开启本项时,将会通过合并光照贴图碎片,自动生成简化过的UV坐标。当光照贴图碎片之间的在世界空间中的距离值小于本值的时候,将会被简化忽略掉
Auto UV Max Angle 当开启本项时,将会通过合并光照贴图碎片,自动生成简化过的UV坐标。当光照贴图碎片之间的夹角小于本值的时候,将会被简化忽略掉
Advanced Parameters 允许你去给当前选中的object,选择或者创建一个光照图参数(lightmap parameters)的集合
Important GI 本项将会告诉Unity从一个物体上发射出来或者反射出来的光,有可能会影响到其他的object。

4.2 Scene Tab

Scene标签面板包含了将会作用在整个场景的object的设置。注意在本面板中【Precomputed Realtime】和【Baked GI】面板可以通过点击单选框去启用或者禁用。

和【Environment Lighting]的光照的参数如下表:

属性 功能
Skybox 天空盒是一个在绘制前最先绘制,而在在位置上则是藏在所有物体的最后面的图象。这个选项则是用来指定本场景所使用的天空盒
Sun 当一个程序化(procedural)的天空盒被使用了。你可以使用本选项指定一个有向光(directional light),用来模拟太阳的方向。从而照亮场景中的物体。如果本选项设置为None的话。将会启用当前场景中亮度值最大的有向光表征太阳。
Ambient Source 环境光(Ambient light)用来照亮整个场景,并且不需要具体制定这个环境光是从哪个object上发出来的。对于环境光源(ambient light),这里有三个选项来操作。【Color】选项简单地使用一个平坦的颜色(flat color)来给场景中的环境光指定颜色。【Gradient】则可以让你给天空(sky),地平线(horizon)还有地面,分别指定颜色,然后从这三个颜色中平滑地混合出一个颜色来给环境光指定颜色。【Skybox】选项则是使用天空盒的颜色,从不同的角度选为作为环境光。
Ambient Intensity 指定场景中的环境光的颜色。
Ambient GI 指定将会用来处理环境光的GI模式(Precomputed Realtime 或者 Baked)。除非两者都选中,否则将不会对场景产生影响。
Reflection Source
Reflection Intensity
Reflection Bounces

和【Precomputed Realtime GI】相关的参数如下表:

属性 功能
Realtime Resolution 这个选项使用实时GI进行照明计算时,将会作用到每个单位长度中的object上的纹素(texel texture pixel)的数量。通常,值为1时是一个最好的值。但对于一些地形物体和一些大型物体而言,通常可以把这个值调小一些,以减少光照贴图的大小。你也可以用程序控制Lightmap Paramters或者MeshRenderer的Scale值去控制光照图的大小。通常,当Realtime GI和Baked GI都启用的时候。这个属性会设置【Indirect Resolution】属性值。
CPU Usage 指定在做实时GI时的CPU数量

和Baked GI相关的参数如下表:

属性 功能
Baked Resolution
Baked Padding
Compressed 烘焙出来的光照图纹理是否压缩
Indirect Resolution 仅当Precomputed Realtime GI禁用时本选项有效。本选项指定了间接光照的计算时生成的光照贴图的分辨率。本值等同于使用预计算实时GI时的Realtime Resolution值
Ambient Occlusion 表面在ambient occlusion中的相对亮度。
Final Gather 当本项启用时,最终在GI计算中的光线反弹将会与使用烘焙式的光照图有着相同的分辨率。启用本项将能改进光照图的质量,但在编辑器中会耗费更多的烘焙时间。

和【General GI】相关的参数如下表:

属性 功能
Directional Mode 光照图可以设置用来存储“在object表面上的每一点,占据优势地位(译注:指入射强度最大的)的入射光”的信息。如果选择【Directional】模式,所生成的第二张光照图就是用来存储这些信息。这样子的话,就可以允许使用在GI中“漫反射+法线贴图”的材质(diffuse normal material)。如果选择使用【Directional Specular】模式,则生成的光照贴图会存储更多的数据信息:这样子甚至可以允许在GI中使用“镜面反射+法线贴图”的材质(specular reflection and normal maps)。如果选用【Non-directional】模式,则关闭使用上述两种模式。使用【Directional】模式的话。需要两倍的大小控件去存储这些附加的光照信息数据。使用【Directional Specular】模式的话就需要使用四倍大小的内存空间去存储。详细细节见Diretional Lightmapping
Indirect Intensity 用来调整在最后生成中的光照图中,用来调整由间接光所照明的亮度值倍数。这个值的缺省默认值为1.0。当比1小时将会减弱间接光照明的亮度,比1大时则增亮间接光照明的亮度
Bounce Boost 用来调整当光线从一个表面反射到另一个表面时的反射增强强度。这个值默认为1.不增强也不减弱
Default Parameters 除了由本Lighting Window界面指定的属性之外。Unity还额外使用了一系列的通用参数集合进行光照贴图计算。本选项就是制定了这些额外使用的参数的类型。详见Lightmap Parameters
Atlas Size 最终合成的整张大的光照贴图纹理的大小