Unity的使用(六):天空盒,灯光和烘焙 | 您所在的位置:网站首页 › 灯光角度有多少种 › Unity的使用(六):天空盒,灯光和烘焙 |
游戏场景的灯光无疑非常重要的,其不仅起到照亮场景的作用,好的灯光更能渲染气氛,使游戏效果更加逼真。然而又不能滥用灯光,因为灯光,阴影等会消耗大量的性能,造成游戏的卡顿,内存消耗太大等问题。因此掌握Unity中灯光,活用灯光非常关键。 对现实生活中光线的反射,折射,衍射等特性的模拟,一直以来都是计算机图形学的重要研究方向。在漫长的发展过程中,出现过很多很多计算方案,总体有这几种: 直接模拟光线从光源发出到最终被物体吸收的正向过程,也就是GI(Global Illumination);不直接模拟光线,而是反向搜集物体表面特定点的受光强度来模拟现实照明效果,也就是FG(Final Gathering);完全不考虑光线的行为,单纯基于“物体上与其它物体越接近的区域,受到反射光线的照明越弱”这一现象来模拟现实照明(的一部分)效果,即AO(Ambient Occlusion);将场景光照结果完全烘焙到模拟贴图上,从而假冒显示光照效果,即Lightmap。前两种方式计算量非常大,往往需要很长时间进行渲染,很难应用在游戏设计领域,在游戏设计领域,光照贴图技术依旧是主流方式。 一. Unity中的灯光,阴影和渲染路径 1. 灯光类型在Unity中灯光属于直接照明(Direct Lighting),灯光本质都是空物体加上灯光组件。直接照明可以产生阴影,但光线不会反射,折射,但可以穿透半透明材质物体。 在Unity中的灯光有:平行光,点光源,探照灯,面积光;此外,还可以创建两种探针(Probe):光照探针组(Light Probe Group,保存光照信息让物体有更真实的光照效果)和反射探针(Reflection Probe,在探头位置生成反射贴图,主要让场景有更好的反射效果)。 Directional Lighting 平行光 平行光通常用来作为阳光,当我们新建场景也会在场景中默认放置一个平行光源,平行光不会衰减。 因为所有灯光都是使用同一个灯光组件,不同的是灯光类型不同,所以下面只介绍每种灯光的特殊属性。![]() 在Unity的灯光中可以为该灯光产生的阴影设置不同的阴影类型,分为:无阴影(NoShadows),硬阴影(HardShadows),软阴影(SoftShadows,阴影模糊效果)。其本质都是使用阴影贴图模拟的阴影效果,而不是真实光照形成的暗色区域。 三种阴影模式,无阴影就是没有阴影,硬阴影边缘清晰,而软阴影边缘柔和,更加贴近现实生活中的阴影,同时计算消耗也会更大。灯光组件上的阴影参数会随着灯光照明模式(Mode)参数不同更改,下面详细说明每个属性的意义: Baked Shadow Angle: 烘焙阴影的角度,当照明模式中包含烘焙时有效;Realtime Shadows Strength: 实时阴影强度,该值越大阴影越黑;Resolution: 阴影贴图分辨率,高精度贴图阴影会更加逼真,同时也更消耗性能和增加内存。Bias: 阴影偏移,增大这个值可以让阴影底部(和产生阴影游戏物体接合处)远离其母物体,可以使用这个属性让阴影显示更加自然,避免阴影贴图盖住游戏物体受光部分;Normal Bias: 法线偏移,增大这个值阴影会向阴影面的法线方向(即阴影突出来的部分)收缩;Near Plane: 阴影近裁切平面,与摄像机距离小于这个距离的场景物体不会产生阴影,一般在0.1附近,或者是光源照明范围的百分之一;Cookie: 相当于给灯光加一个遮罩,用来模拟一些阴影效果,比如贴上网格图模拟窗户栅格效果;Cookie Size: 调整Cookie贴图大小;在属性设置中,Resolution的参数除了使用几个定好参数,也可以使用Use Quality Setting来在Quality面板中定义的。通过Edit->Project Settings->Quality打开Quality面板,在这里可以针对不同质量等级设定参数。 Quality面板才是各种渲染设置的最终决定者。不光只是用来设置阴影质量,渲染质量等也是在这儿进行设置。在这里只介绍其中的阴影设置: ![]() Unity提供两种渲染路径:Forward和Deferred。 Forward 在Forward渲染路径下,每个物体被光源渲染成一个“通道”,物体受到越多灯光光照,渲染次数越多。在灯光较少的情况下,Forward方式渲染速度非常快,处理透明贴图也非常快,还可以使用“多重取样抗锯齿(MSAA)”等这样的硬件处理技术;但会随着灯光的增多渲染速度迅速下降,不适用于多灯光照明场景。Deferred Deferred渲染路径其渲染时间不会随着灯光增多而提高,但是会随着整体受光照影响区域的扩大而提高(若整个场景都已经被照亮,再增加灯光设置复杂度不会进一步影响渲染速度了)。新版本的Unity默认渲染路径是Deferred渲染。 二. 天空盒,间接照明和烘焙除了上面提高的直接照明外,还有间接照明: 环境光(Ambient Light),特指来自天空的漫反射。Unity中可以继承“天空盒”的颜色作为环境光颜色,也可以自行指定环境光颜色;反射光,特指天空漫反射之外的所有环境漫反射。Unity中使用光照贴图或灯光探针来模拟;自发光物体。Unity中自发光物体本身的亮度仅使用颜色来模拟,自发光物体对于环境的影响则通过光照贴图或灯光探针模拟。 1. 设置天空盒当我们进入到生成的默认Unity场景里,会看到一个默认的天空盒,无论我们往什么地方移动周边的景色都没什么变化,彷佛广阔无边。实际上,是因为天空盒跟随着开发者相机移动的,故感觉天空盒广无尽头。 天空盒如同其名,就是一个正方形的稍微大一点的盒子,且贴图是在盒子内部,形成一个全景视图。因此,天空盒的六个面的贴图必须要求是无缝贴图3,这样从任何方向看都是一副连续的画面。 要设置一个天空盒,首先要创建一个材质Material,材质的Shader处有三种选择: ![]() 环境反射(Environment Reflections)的来源(Source)也有两种: 当为Skybox时表示指定天空盒作为反射效果,提供属性选项为: Resolution: 控制将场景中天空盒用作反射效果的分辨率; 当为Custom时表示指定自定义的立方体贴图作为反射效果,提供属性选项为: Cubemap: 需要提供一个CubeMap用作反射效果; 2. Lighting设置补完
Lightingmapping Settings: 当Mixed Lighting的Baked Global Illumination为false时,该模块许多功能会被禁用。 Lightmapper: 指定使用哪种计算方法来计算光照贴图,提供Enlighten和Progressive。Enlighten: 这是一种常用的烘焙计算方法; Progressive: 一种新版的烘焙计算方法,它可以先烘焙摄像机可见区域,再烘焙其它区域,所以预览较快,其提供属性选项有: Prioritize View: 烘焙的先后顺序,勾选后先烘焙摄像机视锥体里的启用的元素;Direct Samples: 直射光的采样数量,更高的采样值会增加光照贴图的质量;Indirect Samples: 间接光的采样数量,同上;Bounces: 间接光的反射次数(和环境光不同的是这个是用于光照贴图计算的);Filtering: 配置在烘焙光照贴图时对噪音的处理: None: 无; Auto: 自动; Advanced: 高级模式,提供Direct Radius, Indirect Radius和Ambient Occlusion Radius,三个选项都是对特定的贴图有值越大会增加模糊但是会减少噪音的效果。Indirect Resolution: 用来指定间接灯光照明计算的每单位有多少纹素4,纹素越大,光照细节越高; Lightmap Resolution: 全局光照产生的光照贴图每单位有多少纹素,通常设置为Indirect Resolution的10倍左右; Lightmap Padding: 修正两个物体在光照贴图中的纹素间隔,以避免颜色渗透; Lightmap Size: 指定生成的光照贴图大小,光照贴图为正方形贴图,边长最大4096纹素; Compress Lightmaps: 是否压缩光照贴图,压缩的纹理可能会带来不需要的纹理效果; Ambient Occlusion: 允许控制环境遮挡的表面亮度(计算像素亮度和场景中附近物体之间的关系,以确定何时阻止特定像素接收附近环境光),较高的值表示遮挡区和全亮区之间较大对比度,仅适用于由GI系统计算的间接照明; Max Distance: 设置从一个物体发出的射线射程,以确定对象是否被遮挡。较大的值会生成较长的射线,并为光照贴图提供更多阴影,较小的值则生成较短的射线,这样只有两个物体非常靠近才会产生阴影。0表示投射无限长射线。Indirect Contribution: 调整间接照明中环境遮挡的对比度,值越大物体产生的光照贴图间接光强度越大。Direct Contribution: 调整直接照明中环境遮挡的对比度,值越大物体产生的光照贴图直接光强度越大。Final Gather: 启用最终聚集时,会对最后一次GI光线反射后的光照结果再以与烘焙的光照贴图相同的分辨率进行一次FG计算。这将增加光照贴图的质量但增加烘焙时间。 Ray Count: 从每个收集点发出的射线数量;Denoising: 将去噪过滤应用于聚集输出;Directional Mode: 提供Directional和Non-Directoinal两个选项,Non-directional为平面漫反射,只有一个光照贴图存储关于表面发出光的信息。在Directional模式下,会生成第二个光照贴图来存储入射光的信息,因此需要两倍的额外光照贴图数据存储空间,shader可以根据这些入射光信息更好的表现。但是定向光照贴图无法在SM2.0或使用GLES2.0时使用,它们将回退到非定向光照贴图。 Indirect Intensity: 间接光照强度,控制实时存储的间接光照和烘焙的间接光照贴图的亮度,默认1。 Albedo Boost: 反射率提高,控制场景中的材质反射率来控制表面间反射的光量,增加此值将以靠近白色5的反射率进行间接光照计算,默认1贴合实际物理现象。 Lightmap Parameters: 设置详细的光照贴图参数(有几个默认值,也可以创建新的参数)。 Other Setting: Fog: 添加场景雾效; Color: 雾效颜色;Mode: 控制随着和摄像机距离的增加,雾效的积累方式,提供的选项有Linear, Exponential(指数), Exponential Squared(指数平方)Start: 距离摄像机多远开始产生雾;End: 距离摄像机多远产生的雾完全遮住场景中的物体; Halo Texture: 光晕贴图,为场景中带有光晕的光源指定一个光晕纹理贴图;Halo Strength: 光晕强度,控制光源周围光晕效果的可见度;Flare Fade Speed: 耀斑淡出速度,控制光源耀斑在最初出现到淡出的时间;Flare Strength: 耀斑强度,控制光源产生的镜头耀斑可见度;Spot Cookie: 指定探照灯的默认Cookie纹理;
上面的参数设定部分其实已经涉及到很多光照贴图方面的内容了,下面来讲讲具体如何进行光照贴图的烘焙(Baking)。光照贴图(Lightmap),其实就是使用贴图来模拟全局照明的效果。 光照贴图需要将所有参与的场景物体的UV重新排列组合成互不重叠且尽量少形变的方形结构,再把光照信息烘焙到一张或几张较大尺寸的贴图中。当所有场景物体放在同一个贴图时,那么一个多边形面片上的光照信息精度就受限于该多边形面片所对应的UV在贴图中所占据的面积大小。出于场景优化考虑,我们当然希望将有限的光照贴图面积尽量多的分配给更需要的物体,因此可以修改不同场景物体的MeshRenderer组件里的所占光照贴图比例的参数6。 当我们把上面Lighting面板中的参数设置完后(或者直接使用默认参数),就可以点击Generate Lighting按钮烘焙光照贴图了。烘焙好的贴图会被储存在场景文件所在目录下与场景文件同名的子目录中,因此烘焙光照贴图前需要保存场景。(如果选择了Auto Generate,则不会在同名子目录中保存光照贴图,需要手动烘焙)。接着就可以在Lighting的Global maps选项卡查看照明系统系统正在使用的实际纹理,包括强度光照贴图,阴影遮罩和方向性贴图;在Object maps预览当前选中的游戏物体的以烘焙贴图的预览。 三. 光照探针和反射探针的使用 1. 反射探针(Reflection Probe)天空盒的信息不可能包含所有场景信息,在很多时候,对象从天空盒收集的反射信息7可能会被遮蔽,向室内对象或隧道中。要准确反射这些对象,就需要用到反射探针。**反射探针从它们的位置对周围取样并把结果写到cubemap上,并让周围经过的物体得到环境的反射镜像。**反射探针越少越好。 使用反射探针产生的cubemap的游戏物体,其MeshRenderer需启用反射探针和一个着色器来支持。 2. 光照探针组(Light Probe Group)烘焙的产生的光照贴图只能用于静态游戏物体,那怎么解决动态物体的光照信息问题呢?为了让动态物体也能够获得某个地点的光照信息,就需要将这些光照信息记录下来,并在运行时能快速读取和使用。 光照探针组就是为此设计的,通过在场景中放置采样点捕捉各个方向的光线信息,将这些记录的光照信息通过球谐函数编码处理后保存为文件,这些信息占用的存储空间很少且运行时解码速度很快。场景中的Shader可以使用这些信息来模拟物体表面的光照。 光照探针运行耗费性能速度也快,在照明小的,凸起的物体上有很好的效果,但是,因为探针是采样计算光照信息,因此对复杂的照明效果很难表现;且每个位置只用一个球模拟,对大模型的光照效果可能不会太好。一个场景中有多个Light Probe Group时,Unity在运行时会自动将这些Group合并,并移除位置重复的Probe。光照探针的具体使用可以参阅这篇文章。 后记这一篇文章断断续续写了一两周,查询了许多资料,也拜读其它许多前辈的博客,但是即便如此,对于Unity中灯光方面,自我感觉还是存在许多的疑惑。也许需要真正在实践中尝试后,再来重读这篇文章才会有新的启发吧。 这里要特别感谢这几位大神的博客,可以说我的很多内容都是参阅他们的资料才写出来的,感兴趣的读者可以去阅读一下原文: https://blog.csdn.net/weixin_42304838/article/details/82495272 https://www.jianshu.com/p/7594b044e6dc 有时候阴影贴图出错,比如无缘无故多出一条亮缝,通常可以切换到Close Fit来解决;或者适当降低灯光阴影参数中Normal Bias参数,或将场景物体设置为双面显示。 ↩︎ ↩︎ Shadow Cascades是一种阴影贴图算法,如我们选择四层级联(Four Cascades),那么实际上会计算4次阴影贴图,每次对应场景中距离摄像机一定范围内的物体;而该距离范围划分就通过Cascades Splits中所显示的紫,绿,黄,红四种颜色区域所占比例来划分;紫色代表最近区域,阴影贴图精度也是最高的。 ↩︎ 当我们选择天空盒的贴图时,注意最好不要使用.jpg或.png这种传统8位色深的图片,除非不需要对场景进行环境光烘焙;若是需要的话,应选择高动态颜色深度的.hdr或.tif图片格式(也就是HDRI)。 ↩︎ 纹素,纹理元素的简称,texel,是纹理图形的基本单位,常用于定义三维对象的曲面。3D对象曲面基本单位是纹理,2D对象由像素组成。3D纹理对象靠近观看时相对较大,每个纹素可能存在好几个像素;而相同的纹理对象被移到很远的距离时,会有每个纹素变得小于像素,然后几个纹素组合成一个像素。纹素甚至可以在观察图像中丢失。 ↩︎ 在现实生活中,白色的物体会反射所有光线,黑色的物体会吸收所有的光线。 ↩︎ 要想出来关于光照贴图参数的设置,要将该场景物体设置为Lightmap Static,可以通过游戏物体Inspector面板右上角的Static右边的下拉箭头设置或是直接勾选MeshRender组件中的Lightmap Static属性。 ↩︎ 实际上天空盒的反射就是一个系统默认的大的环境反射探针。可以在Lighting -> Settings的Environment -> Environment Reflections里设置环境反射。 ↩︎ |
CopyRight 2018-2019 实验室设备网 版权所有 |