请尊重原作者的工作,转载时请务必注明转载自: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可以看到烘焙出来的颜色。