Unity3D何三思Unity3D技术文档翻译

【Unity3D技术文档翻译】第3.6篇 全局光照概述(Glob

2018-07-14  本文已影响7人  何三思
Unity3D技术文档翻译

上一章:【Unity3D技术文档翻译】第3.5.2篇 线性光阴影

本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】

全局光照概述(Global Illumination)

全局光照(Global Illumination,简称 GI)是一种模拟灯光如何从表面反射到其他表面(间接光)的系统,而不是仅仅局限于直接从光源照射到表面的光(直接光)。因为对象之间会互相影响外观,所以模拟间接光产生的效果使得虚拟世界看起来更加真实和连接。有一个被称为“颜色渗透(color bleeding)”的经典例子:阳光照射在一个红色沙发上,导致红色光线反射到了沙发后的墙上。另一个例子是:当阳光照射到一个洞穴的开口处,光线反射到内部,于是洞穴的内部也被照亮了。

场景视图中的光照效果。注意由间接光营造的微妙的效果。

GI 的概念

传统上,电子游戏和其他实时图形应用都被限制为使用直接光照,因为计算间接光照十分慢,因此只被用于像 CG 动画电影这样的非实时场合。游戏解决这个限制的一种方法是:只计算那些预先知道不会移动的物体和表面的间接光(静态的)。使用这种方式,缓慢的计算可以被预先完成,而且因为对象不会移动,这种预先计算的间接光在运行时仍然是正确的。Unity 就支持这种技术,叫做烘焙GI(Baked GI),也被称为烘焙光照贴图(Baked Lightmaps),都是以“烘焙”命名——间接光在这个过程中被预先计算和存储(烘焙)。除了间接光,烘焙GI还利用了更多的计算时间来从区域光(area lights)和间接光( indirect light)中生成软阴影,且通常比实时技术生成的更真实。

此外,Unity 5.0 中增加了一种叫作预计算实时GI(Precomputed Realtime GI)的新技术。该技术和上面提到的烘焙GI类似,也需要一个预计算阶段,而且同样被限制用于静态对象。然而,该技术并不只是预计算在构建那一刻场景中的灯光是如何反射的,而是预计算了灯光所有可能的反射,并将这些信息进行编码,在运行时使用。因此本质上,对于所有静态对象,该技术都能回答这样的问题:当任意光线照射到物体表面,它将反射到哪里?Unity 保存了灯光可能传播的路径,以供后来使用。最终在运行时,通过将实际的光线呈现为预先计算的传播路径,光照效果得以实现。

这意味着灯光的数量、类型、位置、方向以及其他属性都能够被改变,同时间接光照将相应地更新。同理,也可以改变对象的材质属性,比如颜色、吸收或发射多少光。

除非场景很小,否则 Precomputed Realtime GI 生成的软阴影要比 Baked GI 生成的颗粒感更大。同时要注意,Precomputed Realtime GI 在运行时生成最终光照,该过程需要迭代好几帧。因此,如果光照发生了巨大的变化,想要完全起效就需要等待更多的帧。虽然对于实时应用,这已经足够快了,然而如果目标平台的资源受限,使用 Baked GI 会具有更好的运行时性能。

GI 的限制

无论是 Baked GI 还是 Precomputed Realtime GI,都有相同的局限性:只有静态对象能被烘焙或预计算——因此运动的对象就不能发射光到其他对象上,反之亦然。然而,它们仍然能接收使用了 Light Probes(光照探针) 的静态对象的反射光。灯光探针就是场景中,在对灯光进行烘焙/预计算时被测量(探测)的位置,然后在运行时,照射到非静态物体的间接光线使用探针的值进行近似,这些值表示物体在任何给定时刻最接近的值。例如,一个在白色墙壁旁边滚动的红色小球不会把它的颜色渗透到墙上,但是一个红色墙壁旁的白色小球,将会通过光照探针接收来自墙壁的颜色。

GI 效果举例

关于如何实现这些特性,后面的章节会进一步介绍其中细节。(预警:全局光照是3D游戏中非常重要的部分,内容之多甚至足够自成一书。接下来的四十多节,希望通过学习官方手册中的内容能够对全局光照有个全面的了解。)

如果本文对你有帮助的话,点个赞或者评论一下吧!

下一章:【Unity3D技术文档翻译】第3.6.1篇 Enlighten概述

上一篇下一篇

猜你喜欢

热点阅读