unity3D学习笔记之四:再谈全局光照

来源:互联网 发布:企业做内帐软件 编辑:程序博客网 时间:2024/06/07 04:53
全局照明(GI)是一种系统,用于模拟光如何从表面反射到其他表面(间接光),而不仅限于直接从光源(直接光)击中表面的光。 建模间接照明允许使虚拟世界看起来更逼真和连接的效果,因为对象影响对方的外观。 一个典型的例子是“彩色渗色”,例如,阳光击中红色沙发会导致红灯反弹到其后面的墙上。 另一个是当阳光在洞穴的开口处撞击地板并且在内部弹起时,洞穴的内部部分也被照亮。


场景视图中的全局照明。注意间接照明的微妙效果。


GI概念


传统上,视频游戏和其他实时图形应用程序仅限于直接照明,而间接照明所需的计算太慢,因此它们只能用于非实时场景,如CG动画电影。解决这个限制的游戏方法是计算间接光,只能用于提前知道的物体和表面,不能移动(静态)。这样,慢的计算可以提前完成,但是由于对象不移动,所以以这种方式预先计算的间接光在运行时仍然是正确的。 Unity支持这种称为烘烤GI(也称为烘烤光图)的技术,以“烘烤”命名 - 间接光被预先计算和存储(烘烤)的过程。除间接光之外,烘烤GI还利用更大的计算时间,从区域灯和间接光产生更真实的软阴影比通常可以通过实时技术实现。


此外,Unity 5.0还增加了一种称为Precomputed Realtime GI的新技术的支持。它仍然需要类似于上述烘焙的预计算阶段,并且仍然限于静态对象。然而,它并不只是预先计算场景中的光在构建时的反弹,而是预先计算所有可能的光反弹并对这些信息进行编码,以便在运行时使用。所以基本上所有的静态对象都能够回答“如果有任何一个光线碰到这个表面,它在哪里跳到哪里?”Unity然后保存这些关于光可以传播的路径以供以后使用的信息。通过将存在的实际光馈送到这些先前计算的光传播路径中,在运行时完成最终照明。


这意味着灯的数量和类型,它们的位置,方向和其他属性都可以改变,并且间接照明将相应地更新。类似地,也可以改变物体的材料特性,例如颜色,吸收多少光或发光的光量。


虽然预计算实时GI也会产生柔和的阴影,但是除非场景非常小,否则它们通常必须比使用烘烤GI可以实现的更粗糙。还要注意,虽然预计算实时GI在运行时完成了最后的照明,但它在多个帧中反复执行,因此如果在照明中进行了大的改变,则需要更多的帧才能完全生效。虽然这对于实时应用程序来说足够快,但如果目标平台的资源非常有限,最好使用Baked GI来获得更好的运行时性能。


地理标志局限性


烘烤GI和预计算实时GI都有限制,只有静态对象可以包含在烘焙/预计算中 - 所以移动物体不能将光反射到其他物体上,反之亦然。然而,他们仍然可以使用光探测器从静态物体拾取反弹光。光探测器是在烘烤/预先计算期间测量光(探测)的场景中的位置,然后在运行时,使用来自探针的值来逼近非静态对象的间接光,对象最接近于任何给定时刻因此,例如在白色墙壁旁边卷起的红色球体不会将其颜色渗透到墙壁上,而在红色墙壁旁边的白色球体可能会通过光线探测器从墙壁上吸收红色的颜色。


GI效果的例子


改变定向光的方向和颜色,以模拟太阳在天空中的影响。通过修改天空盒以及定向灯,可以创建一个在运行时更新的真实时间效应。 (事实上​​,新的内置程序天空盒可以轻松实现)。
随着一天的进步,通过窗户流动的阳光流过地板,这种光线实际上在房间和天花板上弹跳。当阳光到达一个红色的沙发时,红色的光线就会反弹到它后面的墙壁上。将沙发的颜色从红色变为绿色将导致墙后面的颜色从红色变成绿色。
激活霓虹灯材料的吸引力,使其在开启时开始向周围环境发光。