分类:Unity、C#、VS2015app
建立日期:2016-05-19编辑器
在Unity 5中,Lighting是—种加强场景光照和阴影效果的技术,它能够经过较少的性能消耗使静态场景看上去更真实、丰富,以及更具备立体感,又能够对动态对象进行处理。性能
早期版本的Unity 4只能对“静态”对象和“动态”对象分别进行处理,称为Lightmapping(光照贴图),可是,Lightmapping不能被用来实时地处理“动态”光照;而在Unity 5中,与Lightmapping相关的功能被从新整合在Unity引擎中并经过【Window】->【Lighting】打开设置窗口,在Lighting窗口中,开发人员只须要简单的操做,就能够制做出平滑、真实且不生硬的光影效果。htm
Light Probes是一种在运行时将“动态对象”融入“静态场景”的技术,利用它可解决实时处理“动态”光照的问题。其基本原理是:先在场景空间中放置一些采样点来收集其周围的明暗信息,而后在运行时对动态对象邻近的采样点进行插值运算,并将插值结果做用于动态对象上。因为插值运算并不会耗费太多的性能,所以这种方式既能实现动态游戏对象和静态场景的实时融合效果,又不会致使内存资源的极大消耗。对象
使用Unity 5提供的功能实现光照贴图和光影效果前,首先须要掌握两个基本概念:一个是GI,另外一个是Realtime GI。blog
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)之外,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”了。