Lighting overview
原文链接:https://docs.unity3d.com/Manual/LightingInUnity.html
Lighting 概览
为了计算一个三维物体的shading, Unity需要知道照射到物体上光线的亮度,方向和颜色.
这些属性由场景中的Light对象提供. 不同类型的Light根据指定的颜色以不同的方式发光;有些光从光源发出后,亮度随距离增加而减弱,并且光线从光源到物体的角度也会不一样.不同类型的光源的详细介绍参考链接:Types of light.
Unity能为不同的用途用不同的方法计算复杂、高级的光照效果.
选择一个光照技术
在unity中光照基本上可以被分为'realtime'或者'precomputed', 两种技术也可以混用,以创造身临其境的光照场景.这部分内容会简单介绍这两种技术之间相对的优点以及各自的性能特征.
realtime lighting
默认情况下,unity中的 directional, spot 和 point三种light是realtime类型的.也就是说它们向场景中发射直射光,并且每帧都会更新.当lights和GameObjects在场景中移动时,光照会立刻更新.可以同时在场景和game视图中观察到这一点.
只有realtime light时的显示效果.注意由于没有反射光导致阴影是完全黑暗的.只有落入spot light视锥范围内的面被照亮.
Realtime光照是场景中最基础的光照对象,照亮移动中的角色或其他物体时非常有用.但是仅仅使用realtime lights本身时,光线是不会反射的.为了用 global illumination技术创造出更加真实的场景,我们需要启用Unity的 precomputed光照方案.
Baked lightmaps
Unity能够计算复杂的static光照效果(使用一个叫做global illumination或gi的技术),并且将其存储在一个叫做lightmap的参考纹理图中.这个计算过程被称为baking.当baking lightmap时,场景中static类型物体的光照效果会被计算成纹理,叠加到场景中几何物体的表面,从而创造出光照效果.
左图:一个简单的生成了lightmap的场景. 右图:Unity生成的lightmap纹理.注意阴影和光照信息都在lightmap中.
lightmaps能够处理照射到物体表面的直射光和从场景中其他物体或表面反射的间接光。形成的光照纹理和物体表面的颜色、法线信息都可以被物体材质的Shader处理。
光照bake后形成的lightmap在游戏过程是不能改变的,所以它们也被称为static类型的。Realtime光照可以覆盖叠加到场景中lightmap的表面,但是lightmap本身是不能改变的。
使用这种方法,我们可以牺牲在游戏中动态移动lights的功能,换取性能的提升,以满足硬件性能较低的移动平台。
Precomputed realtime global illumination
由于static lightmaps不能反映场景中光照条件的变化,precomputed realtime GI提供了动态更新复杂场景光照的技术。
这种方法使得通过实时响应光照变化的反射光创造特征丰富的光照场景成为可能。一个很好的例子是时间系统:光源的位置和颜色随时间发生变化。传统的backed光照是不可能实现这个功能的。
使用Precomputed Realtime GI实现的一个简单的时间系统。
为了在游戏可接受的帧率下达到这些效果,我们需要将一些冗长的数学运算从实时计算转化为precomputed. 游戏中发生的交互会引起复杂的光照行为,precomputing将计算负担转移到时间不是很关键的阶段去处理。这种方法称为‘offline’处理。
更深入的信息请参考链接:lighting and rendering tutorial
益处和代价
Backed GI和Precomputed Realtime GI是可以同时使用的,但要记住性能消耗是单独使用两种技术的和。我们需要在显存中同时存储两套lightmaps,而且shaders对两者都要进行decoding。
在这两中技术中选取哪一种,取决于你的项目需求和目标设备的硬件性能。比如在显存和处理能力比较受限制的移动设备上,选择Baked GI光照技术能够提供较好的性能。在有较好的图形硬件的计算机或者较新的游戏终端上,可以选择 Precomputed GI 甚至同时使用这两种技术。当项目的目标硬件设备范围较广时,需要支持的硬件性能最低的设备往往决定了需要采用哪种光照技术。