【Unity灯光与渲染技术】unity5新版的光照系统

在unity5新版本中,是完全新的光照系统,由以下三部分组成:Enlighten + Probes + Screen Space Reflection

Enlighten

Enlighten是全局的基础光照,由于它不能做动态的计算,这个光照系统在实现过程中需要将物体设置为Static。所以可以称之为静态全局光照的实现。

Probes

除了静态的光照实现,动态的全局光照实现则由Probes这个光照系统来实现。现在接触两种类型的Probes,一个是Light Probes,一个是 Reflection Probes。两者的区别在于,Light Probes是用于提供动态物体的光照信息,将其烘焙在贴图中;而Reflection Probes我的理解是在遮蔽空间对天空盒信息的补充。以下是两个Probes的具体概念

光探头(LIGHT PROBES)

为了使动态对象能够和静态场景接收到的光影信息互动,需要纪录这些光的信息并做成可以在执行期间快速存取的格式。在场景放置许多取样点来截取各个方向搜集来的信息,颜色信息会被编成能在游戏中快速被取出的一组数值(或系数),这些取样点我们称为”光探头”。光探头允许移动对象接受由全局光照GI所计算出来复杂的反射光源,对象在著色网格的时候会判断附近光探头的位置并且把光的信息一并融合计算,这是透过找寻由光探头所产生的一个四面体,然后决定哪个四面体的落入对象的轴向,这样就能让场景内的动态对象正确地接受光信息,如果没有放置光探头,动态对象就无法接受全局光照的信息,造成动态对象比场景还要暗。预设的情况下,场景是没有任何光探头的,必须从GameObjects->Light->LightProbe Group自行建立光探头群组。假如全局光照里的Auto是打勾的(Lighting->Scene->Auto),当光源或是静态对象更新时,光探头信息也会实时更新,没打勾的话必须点Build运算才会更新。

 

反射探头(REFLECTION PROBES)

天空盒的信息不可能包含所有的场景对象,在许多情况下,对象从天空搜集反射信息时可能会被遮蔽,像是室内对象或是在类似桥或是隧道等建筑物里的对象,为了要准确反射这些对象,必须用反射探头针对这些对象取样,这种探头从他们的位置对周围取样并把结果写到方体贴图,可以让周围经过的物体得到环境的反射影像。可以透过GameObject->Light->Reflection Probe来新增一个反射探头,反射探头的位置会决定方体贴图取样的内容,以及反射所看起来的样子,基于效能考虑反射探头越少越好,反射探头并非用来让物理得到精确结果,而是让游戏世界有更好的反射,大多数情况下几个安排妥当的反射探头就很足够了。

 【Unity灯光与渲染技术】unity5新版的光照系统_第1张图片

左图:场景只有预设的反射设定   右图:场景加入了反射探头后的结果

 

在反射探头的属性面板可以设定Type为实时(Realtime),烘焙(Baked)或自定义(Custom),需要明白的是,实时反射的设定对效能极为不利,每多一个实时反射探头就会多出额外六次的著色运算,因此摆设实时的反射探头应该要有明确的需求,例如反射会闪动的霓虹灯,否则一般来说建议设成烘焙的就够了,效能也会好很多。需要注意的是,只有标记为”ReflectionProbe Static”的对象才会被反射探头取样,从属性接口上静态对象(Static)的下拉选单打勾即可,相反的,实时的反射探头会对所有可见的物体取样,除非在屏蔽(Mask)选单指定剔除它。

 屏幕空间反射(Screen Space Reflection)

 屏幕空间反射(Scene Space Reflection,SSR)又叫实时局部反射(Realtime Local Reflection,RLR)   其原理主要通过逐像素地方式计算反射向量,对于DefferedShading来说可以简单使用G buffer中的depth 和 normal求出追踪反射射线,具体做法为从反射点沿反射方向按步进,采样步进点的depth 并比较采样点depth和步长方向的depth进行求交,如果两个depth之间距离小于误差范围,则认为相交。对于有相交点的光线,采样上一帧该点的颜色,采样颜色以混合方式贡献到目标反射点最终着色中。除了基础的SSR算法,Crytek还提供了一些基本的优化手段:使用Jitter后的步长行步进,可以在一定程度上规避固定步长带来的走样;对SSR的结果进行Filter,得到更平滑的结果; 基于和视点距离和屏幕距离对SSR进行淡出处理,离视点反射越远,反射越模糊

 目前关于SSR的实现在各大引擎里也各不相同,Cryengine最初的算法只要屏幕depth小于步进点depth就以屏幕当前点作为反射点,而UE4里的实现会更有更精确的光线求交---当depth之间的距离小于指定误差才当作交点。SSR的射线追踪在发现当前采样depth小于反射射线depth时,回塑进行二分查找近似的交点。Klayge的SSR实现是在uv空间进行步进,而很多其它实现则多在投影空间步进。

   此外,2014的Siggraph上,Killzone的Course《REFLECTIONS AND VOLUMETRICS OF KILLZONE SHADOW FALL》比较系统地介绍了Killzone怎么把SSR结合到渲染管线里去,及怎么实现基于图像的视差正确的局部反射。

你可能感兴趣的:(游戏引擎,Unity灯光与渲染技术)