Unity 光照

一、光照

       然后出现了所谓的高级渲染器,用计算机的计算来代替我们的手工劳动来进行这个“模拟”的工作。在漫长的发展过程中,出现过很多很多计算方案,总体上分为这样几类:

  1. 直接模拟光线从被光源发出到最终被物体完全吸收的正向过程,也就是常说的GI(Global Illumination);
  1. 不直接模拟光线,而是反向搜集物体表面特定点的受光照强度来模拟现实照明效果,也就是常说的FG(Final Gathering);
  1. 完全不考虑光线的行为,单纯基于“物体上与其他物体越接近的区域,受到反射光线的照明越弱”这一现象来模拟模拟现实照明(的一部分)效果,也就是常说的AO(Ambient Occlusion);
  1. 将场景光照结果完全烘焙到模型贴图上,从而完完全全的假冒现实光照效果,也就是我们所说的Lightmap。
  1. 对于静态物体来说,大多使用光照贴图来模拟间接光的照明效果,然后加上直接光源的动态照明效果;
  1. 对于运动物体来说,则仅用直接光源的动态照明效果,或者使用光照探针来模拟间接光的照明效果。

不论是GI还是FG,计算量都是非常大的,一帧图片需要几十分钟甚至几十小时来渲染,所以很难被应用在游戏设计领域。

因此在游戏设计领域,光照贴图技术依然是目前的主流方式。

由于光照贴图需要事先烘焙(baking)出来,且仅支持静态物体(Static Object),而我们的游戏场景中几乎不可能全都是静态物体,所以通常游戏场景中的灯光照明是多种照明方式的混合作用。

     unity3D光照系统Lighting菜单中,一共有6个选项,分别为Directional Light(平行光),Point Light(点光源),Spotlight(聚光灯),Area Light(区域光),Reflection Probe(反射探头),Light Probe Group(光照探头组) 其中前四个为unity中的灯光,如图:


 1.Directional Light(平行光) 

平行光通常是用来做阳光的,unity的默认在场景里放置平行光。平行光不会衰减。


  • Type:灯光类型,所有类型的灯光都其实共用一个组件,本质上是一样的。
  • Directional(方向光):灯光放在无穷远处,它影响着场景里所有物体。
  • Color:灯光颜色。
  • Mode:灯光照明模式,每种模式对应Lighting面板中一组设定。
    • Realtime:对应Realtime Lighting。
    • Mixed:对应Mixed Lighting。
    • Baked:对应Lightmapping Setting。
Realtime Lighting是新 出现的一种烘焙光照技术,它并不像传统的烘焙技术一样直接烘焙间接光照颜色和亮度信息到光照贴图上,而是烘焙物体和物体之间的关系信息,比如A面对B面有漫反射效果,B面对C面有漫反射效果等等。这样一来,只要物体之间的关系不变(也就是所有的静态物体都不移动位置),就不需要重新烘焙,从而使得我们可以在场景中随意运用动态光源(dynamic lights)。而传统的Lightmapping光照贴图方式则不支持动态光源效果(改变光源不会改变场景光照)。Realtime Lighting比Lightmapping要更耗费系统资源,所以手游上就不要考虑了。
  • Intensity:灯光强度
  • Indirect Multiplier:在计算该灯光所产生的间接光照时的强度倍乘
  • Shadow Type:阴影贴图的类型
    • No Shadows:无阴影贴图
    • Hard Shadows:硬阴影贴图
    • Soft Shadows:光滑阴影边缘(也就是阴影模糊效果)
Hard Shadow和No Shadow对性能消耗的比较小。选择伊宁之后,会出现新的小菜单。Strength代表阴影的强度,数值在0~1之间,1时阴影最明显,0时无阴影。Resolution代表阴影的分辨率,Use Quality Setting表示在游戏开始时根据玩家的选择来设置阴影质量,其他四个依次代表从低分辨率到高分辨率。
  • Baked Shadow Angle:烘焙阴影的角度
  • Realtime Shadows Strength:实时阴影强度
  • Resolution:阴影贴图分辨率
  • Bias:阴影偏移,通常适当增加这个值来修正一些阴影的artifact
  • Normal Bias:法线偏移,通常适当减少这个值来修正一些阴影的artifact(不同于Bias的使用场合)
  • Near Plane:阴影剪切平面,对于与摄影机距离小于这个距离的场景物体不产生阴影
  • Cookie:Cookie相当于在灯光上贴黑白图,用来模拟一些阴影效果,比如贴上网格图模拟窗户栅格效果
  • Cookie Size:调整Cookie贴图大小
  • Draw Halo:灯光是否显示辉光,不显示辉光的灯本身是看不见的
  • Flare:Flare可以使用一张黑白贴图来模拟灯光在镜头中的“星状辉光”效果
  • Render Mode:渲染模式
  • Culling Mask这个用来照亮选择性的部分场景。
2.Point Light(点光源)

          点光源模拟一个小灯泡向四周发出光线的效果,点光源在其照亮范围内随距离增加而亮度衰减

  • Range光线射出的范围,超出这个范围则不会照亮物体。

3.Spotlight(聚光灯)

聚光灯模拟一个点光源仅沿着一个圆锥体方向发出光线的效果,聚光灯在其照亮范围内随距离增加而亮度衰减


  • Spot Angle灯光射出的张角范围。灯光的聚光角度。

4.Area Light(区域光)

        面积光模拟一个较大的发光表面对周围环境的照明效果,通常面积光的灯光亮度衰减很快,阴影非常柔和。unity3D的区域光仅在烘焙光照贴图时有效,并不像Maya的Area Lights一样能动态照亮场景。它只能作用于静态物体,通过烘焙来生成光照贴图,从而减少了性能的开销。

  • Width面积光宽度。
  • Height面积光的高度。

5.Reflection Probe(反射探头)-Unity - Manual: Reflection Probe

Unity3D中并没并真实的Raytrace反射,而是通过反射贴图来模拟所有的反射效果。

如果我们在场景中放置一个非常强反射的小球,我们就能看到这个小球上实际反射的是我们的Skybox,完全不会反射场景物体。这样一来不仅影响到场景中反光物体的反射正确性,同时也会严重影响整体场景的光照准确性。

我们可以为场景添加Reflection Probe来矫正不正确的反射贴图。

Reflection Probe可以看做是一个带有6个摄影机的点,它会渲染该点的6个方向(前后左右上下),将渲染结果拼成一个Cubemap,并应用给一个特定方框范围内的所有物体作为反射贴图。

对于比较复杂的环境,比如有多个区域的大房间,我们可以放置多个Reflection Probe并手动设置其影响范围。

Reflection Probe默认不会计算动态物体,仅计算烘焙物体,我们可以修改属性让其将动态物体也包括在内,同时还可以修改属性为Every Frame 使其每帧更新以准确反射动态物体的运动过程,还可以增加Lighting Setting中的Reflection Bounces提高反射次数(这样就不会出现强反射物体在另一个反射物体中是黑色的情况了)。但要注意,这些修改都会占用更多的系统资源,尤其是每帧更新反射贴图这样的设置。

6.Light Probe Group(光照探头组)-Unity - Manual:Light Probes

       光照烘焙对于动态物体(Dynamic Object),也就是没有被设置成Lightmap Static的物体来说都是不起作用的,如果希望动态物体也能被正确的照明,则需要创建Light Probe Group。Light Probe可以被认为是在场景中的一个小“光源”,而多个Light Probe组成的网络,就是Light Probe Group。这些小光源通过烘焙得到场景中该点的亮度信息,然后整个网络用这个信息来照明动态物体。同一时间内只会有最靠近动态物体的那些Probes会起作用,而且Light Probe离运动物体越近,其照明效果越强。我们可以根据场景光照环境特征来设置合适的Light Probe Group。为场景添加Light Probe Group可以很好的将动态物体与静态场景融合,尤其是在光照环境复杂的室内场景中,尤其需要添加Light Probe Group。

二、全局光照(GI)-Unity - Manual: Lighting Window

点击 Window > Lighting > Settings 会弹出Lighting窗口,这个就是设置全局光照的窗口。

这个Lighting窗口划分了三个区域:

       1、Scene:设置适用于整个场景而不是单个GameObjects。这些设置控制灯光效果和优化选择。

       2、Global maps:显示所有lightmap资产文件生成的GI照明过程。

       3、Object maps:预览当前选中的GameObject的GI lightmap纹理(包括阴影遮罩)。

下方有一个Auto Generate,勾上它,unity就会自动更新Lightmap 数据,但更新的过程非常耗时,

因此不建议勾选 Auto Generate。可以手动点击Generate Lighting来烘焙。(注意,unity只会烘焙

勾选了Lightmap Static 的GameObject,so 烘焙之前,首先在Inspector 面板最上方的Static 选中Lightmap Static)


1.Environment(环境)

  • Skybox Material:天空盒材质
  • Sun Souce:设定一个定向光(directional Light作为场景里的太阳,如果设置为None,unity则将最亮的定向光作为太阳(太阳:不管你设置的多大远多,光都会照到场景里)
  • Environment Lighting:环境光设置
  • Source漫反射环境光(背景光),默认以天空盒作为环境光。
    • Color以某种颜色作为环境光。
    • Gradient (梯度)sky, horizon and ground分别选择一种颜色,混合出一种环境光。
    •  Skybox天空盒作为环境光。
  • Intensity Multiplier(光照强度)环境光的亮度,范围是0-8,默认为1。
  • Ambient Mode (微光模式)场景中GI的模式。
    • Realtime实时更新。
    • Baked烘焙(预先计算场景中的灯光)。
  • Environment Reflections全局设置反射参数。
  • Source:反射源。
    • Skybox天空盒作为反射源。
    • Custom用一个cube map作为反射源。
  • Compression(压缩):反射贴图是否被压缩。
    • Auto:自动,如果适合压缩,那就压缩。
    • Uncompressed:不压缩。
    • Compressed:压缩。
  • Intensity Multiplier:强度倍数,反射光的强度。
  • Bounces(反弹):反弹度,一束光的被反射的次数。

2.Realtime Lighting(实时照明)
  • Realtime Global Illumination是否开启实时全景光照,勾选此项,Unity会实时计算和更新和照明。

3.Mined Lighting(混合照明)

  • Bake Global Illumination是否采用烘焙的全局光照。unity预计算光照,在运行的时候设置到场景中。
  • Lighting Mode决定混合灯光和场景中物体(GameObject)的阴影的模式。注意:修改了Light Mode需要重新烘焙,如果光照窗口中的自动生成是开启的,会自动烘焙,否则需要点击按钮进行烘焙。灯光模式:间接烘焙,阴影遮罩,删减的
  • Realtime Shadow Color实时阴影的颜色。 只有light mode设置为Subtractive的时候这个选项才有用。

4.Lightmapping Settings(光照贴图设置)

  • Lightmapper:这个属性用来指定用哪个内部光照计算软件来计算场景中的光照贴图,选项是Enlighten和Progressive,前者是默认选项。光照贴图:开启,预览。
  • Indirect Resolution:用来指定每个单元上间接光照计算所用的纹素个数。增大这个值会改善间接光照的视觉品质,但增大了烘焙lightmap的时间。间接分辨率(增加此值可提高间接光质量,同时也增加烘焙时间)
  • Lightmap Resolution:指定每个单元上用在光照贴图上的纹素数。增大这个值会提高lightmap质量,增长烘焙时间,默认值是40。光照分辨率(增加此值可提高光照贴图的质量,同时也增加烘焙时间)
  • Lightmap Padding:烘焙光照贴图中分开的形状之间的距离。默认值是2。光照图内边距(此值制定烘焙光照贴图中不同形状之间的间隔)
  • Lightmap Size:整个lightmap贴图的大小,集成了单个对象贴图的分开的区域,默认值是1024。光照图大小(128*128,512*512)
  • Compress Lightmaps:压缩lightmap需要更少的存储空间,但压缩处理会给贴图带来影响,默认勾选。压缩光照图
  • Ambient Occlusion:当勾选上时,开启了许多 允许你控制环境遮挡的表面相对亮度的设置。值越大表面遮挡区域和全照明的区域之间的对比更大。这仅仅对用GI计算的间接光照有影响,默认是开启的。环境光遮蔽(控制环境光遮挡中表面的亮度)
    • Max Distance:用来控制检测一个物体是否被遮挡所用的射线投射的距离。值越大射线越长,light map中阴影更多。值越小,射线越短,只有物体之间距离较近的时候才会有阴影。值为0,会投射一个无限长的射线,没有最大距离。默认值为1。
    • Indirect Contribution:控制最终lightmap中间接光照的明暗度,范围是0到10,默认为1,小于1减小强度,大于1增强。
    • Direct Contribution:0-10控制直接光强度,默认是0,值越大,应用到直接光上的对比越强。
  • Fina Gather:当Final Gather选项被勾选上,GI计算中最后的光的反射将会和烘焙的lightmap一样的分辨率进行计算。这会提高lightmap的视觉品质,但会在编辑器中花费额外的烘焙时间。最终渲染。
    • Ray Count:
    • Denoising:
  • Directional Mode:lightmap可被用来存储对象表面的任意一个点的主导的入光信息。在Directional模式下,第二张lightmap会被生成,用来存储占主导地位的入射光线的方向。这允许法线映射漫反射材质和GI合作。Directional Specular模式,更多的数据用来存储全阴影和高光反射和法线映射。None-directional 模式将这两种选择关掉。Directional模式要求两倍的存储空间来存储另外一张lightmap数据。Directional Specular要求4倍的存储空间和两倍的贴图内存。定向模式:非定向,定向(生成第二个光照贴图来存储入射光的方向)
    • Directional:
    • Nondirectional:
  • Indirect Intensity:该值用来scale在最终的lightmap中间接光照的亮度。设置为1,则用默认的倍数,小于1降低强度,大于1增强亮度。间接强度(控制实时存储的间接光照贴图的亮度)
  • Albedo Boost:一个scale值,增加从表面到其他表面的光的数量。默认值为1,表示没有增加。反照率提高(控制表面之间反弹的光量)
  • Lightmap Parameters:Unity用了一些其他的参数来表示lightmap,除了light窗口中的。一些默认的通过这个属性的菜单就可以使用,但你也可以创建自己的light参数文件,用create new选项。光照图参数:中等,高,低,非常低分辨率


5.Other Settings(其他设置)

  • Fog:
    • Color:全局雾效的颜色。
    • Model: 雾效计算的模式,雾根据与相机的距离进行积累的方式。有Linear,Exponential和Exponential Squared3中(这些是递增的顺序雾随着距离的积累
      • Linear:
        • Start:(在Linear模式下才生效) 离摄像机的最近距离。
        • End:在Linear模式下才生效)  离摄像机的最远距离
      • Exponential:
        • Density:
      • Exponential Squared:
        • Density:
  • Halo Texture:画光晕的贴图。光晕贴图
  • Halo Strength:环绕着光的可视光晕。光晕强度
  • Flare Fade Speed:炫光出现后褪去的速度。耀斑褪色速度(镜头光晕从事也中小时的时间,以秒为单位)
  • Flare Strength:炫光的长度。耀斑强度。
  • Spot Cookie:点光源的cookie贴图。斑点纹理(设置聚光灯的Cookie纹理)


6.Debug Settings(调试设置)

  • Debug Settings:
  • Update Statistics:
  • Light Probe Visualization:光探针可视化。
    • Only Probes Used By Selection:只有选择使用Probes(只有影响当前选择Light Probes才能在场景视图中可视化)。
    • All Probes No Cells(所有Probes没有单元格):所有probes在场景中可视化。
    • All Probes With Cells(所有Probes有单元格):所有probes在场景中可视化,同时还显示用于probes数据插值的四面体。
    • None(没有):在场景视图中不显示probes。
  • Display Weights:显示重量(用于选择probes绘制一条直线到用于插值的四面体上)
  • Display Occlusion:显示遮挡(显示probes的遮挡数据)
  • Auto Generate:自动渲染。
  • Generate Lighting:渲染光照。