【Unity】第13章光照贴图和光影效果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【Unity】第13章光照贴图和光影效果
分类:Unity、C#、VS2015
创建⽇期:2016-05-19
⼀、简介
在Unity 5中,Lighting是—种增强场景光照和阴影效果的技术,它可以通过较少的性能消耗使静态场景看上去更真实、丰富,以及更具有⽴体感,⼜可以对动态对象进⾏处理。
早期版本的Unity 4只能对“静态”对象和“动态”对象分别进⾏处理,称为Lightmapping(光照贴图),但是,Lightmapping不能被⽤来实时地处理“动态”光照;⽽在Unity 5中,与Lightmapping相关的功能被重新整合在Unity引擎中并通过【Window】->【Lighting】打开设置窗⼝,在Lighting窗⼝中,开发⼈员只需要简单的操作,就可以制作出平滑、真实且不⽣硬的光影效果。
Light Probes是⼀种在运⾏时将“动态对象”融⼊“静态场景”的技术,利⽤它可解决实时处理“动态”光照的问题。
其基本原理是:先在场景空间中放置⼀些采样点来收集其周围的明暗信息,然后在运⾏时对动态对象邻近的采样点进⾏插值运算,并将插值结果作⽤于动态对象上。
由于插值运算并不会耗费太多的性能,因此这种⽅式既能实现动态游戏对象和静态场景的实时融合效果,⼜不会导致内存资源的极⼤消耗。
⼆、全局光照(GI)
使⽤Unity 5提供的功能实现光照贴图和光影效果前,⾸先需要掌握两个基本概念:⼀个是GI,另⼀个是Realtime GI。
GI(Global Illumination,全局光照)是指世界坐标系(Global)中模型A被光照射后反射到其他模型表⾯的光(间接光),⽽不是光源直接照射到模型A的直接光。
例如,阳光照在红⾊的沙发上会导致红光反弹到它背后的墙上,从⽽使墙看上去也有浅浅的红⾊光照效果。
另⼀个例⼦是阳光照射在顶部只有⼀个⼩⼝的房间⾥,这会导致该房间内的其他部分也被物体反弹(反射)的光照亮了。
下图是⼀个应⽤了全局光照(GI)效果的场景,在这个图中,由于反弹光(间接光)的作⽤,导致整个场景看起来明亮、华丽、更具有⽴体真实感。
传统的电影技术⼀般只有直接光(如直射光、点光、……等光源)产⽣的效果,当实时地模拟间接光产⽣的效果时,由于模拟间接光需要进⾏⼤量的计算,会导致电影播放性能⼤⼤降低,因⽽在实际的电影制作时⼀般分两步来做这件事:前期拍摄和后期制作。
在Unity中,这种类似于电影前期拍摄的⼯作称为预处理。
预处理是在Unity编辑器中进⾏的,主要针对静态的对象进⾏处理,该技术称为Baked GI(也叫Baked Lightmaps),即预先对间接光进⾏烘培(Bake)处理,烘培的⽬标是场景中事先被标记为Static的对象;⽽类似于电影后期制作的⼯作在Unity中称为Light Probes,即先通过在场景中添加⼀些采光点(采样点),再在运⾏时利⽤采光点的反弹(间接光)效果照亮其周围,从⽽使整个场景看起来明亮华丽、赏⼼悦⽬。
在Unity 5.0之前的版本中,这种将Baked GI和Light Probes组合起来的技术就是全局光照(GI),也叫光照贴图(lightmaps)。
换⾔之,先在Unity编辑状态下对场景中的静态对象进⾏“预处理”,然后再在运⾏时利⽤Light Probes进⾏后期处理。
这样⼀来,游戏运⾏的场⾯看起来就会明亮、华丽、⽓派。
三、实时GI(Realtime GI)
除了全局光照技术(GI)以外,Unity从5.0开始,⼜提供了⼀种新的称为“Precomputed Realtime GI”的技术,其原理类似于5.0以前的早期版本提供的Baked GI技术。
不过,虽然该技术针对的仍然是静态的对象(即仅限于对被标识为static的对象进⾏处理),但是,它和Baked GI 最主要的区别是:通过“Precomputed Realtime GI”预处理的结果还可以直接⽤于运⾏时(runtime)的动态对象照明。
其实现原理是:Unity 先把预先烘培(Bake)的信息(位置、⽅向、颜⾊、……等属性)保存下来,这样⼀来在运⾏时就可以直接通过这些预处理信息对动态对象进⾏照明处理了。
换⾔之,在Unity 5中,只需要通过“Realtime GI”技术,就可以在运⾏时⼤⼤提⾼照明渲染处理的性能,⽽不需要再使⽤Baked GI+Light Probes进⾏组合处理了。
四、结论
总之,实现全局照明提供光阴效果时,要么采⽤⽅式1(Unity 5之前的早期版本提供的“Baked GI”+“Light Probes”组合起来的技术),要么采⽤⽅式2(从Unity 5.0开始提供的“Precomputed Realtime GI”技术)。
但是,不能同时采⽤⽅式1和⽅式2,否则很快就会把内存吃光,从⽽导致⾮正常的⾃动关机(这应该是个新的bug,估计后续的版本会解决这个问题)。
再次提醒注意:“Baked GI”和“Precomputed Realtime GI”都是对“静态”的对象⽽⾔的,即都需要先将被烘培的对象标识为“Static”才能对其进⾏照明烘培预处理。
⽽对于动态的对象来说,如果烘培静态对象时使⽤的是“Baked GI”技术⽽不是“Precomputed Realtime GI”技术,那么还可以利⽤预先放置的采光点在运⾏时通过“Light Probes”实现对动态对象照明;如果烘培静态对象时使⽤的是“Precomputed Realtime GI”技术,由于在运⾏时它可以直接对动态对象进⾏照明处理,因此这种情况下就不要再使⽤“Light Probes”了。