光照贴图(Lightmap)是一种效果明显的模拟光照的方法,这种光照贴图需要提前渲染,因此可以应用在静态效果图中,属于全局照明技术。但是这种方法一般只适用于静态物体。当然unity做了很多工作,可以让我们混合使用静态光照贴图和动态实时光源,无缝地照亮场景中静态或动态的物体。
注意,受到光照贴图的影响的物体只能在静态物体上合并批次渲染。动态和GPU Instancing两种合并批次的方式unity不支持(unity2018支持GPU Instancing)。unity对光照贴图支持在于导入一张光照贴图,被多个物体共享,然后使用一个Vector4的数据类型规定贴图的大小和偏移量。
光照贴图不仅可以在unity中创建,还可以使用任何可渲染软件来创建,但这里只使用unity中的Lightmapper。
一、烘焙的维度和属性矩阵
照明的属性矩阵介绍如下:
首先物体或者灯光有静态和动态之分,这是一个维度,有两个属性。
其次,灯光(Light)组件有两个属性Mode和Render Mode。Mode的可选值为Midxed、Realtime、Baked,Render Mode的可选值为Auto、Important、Not Important。两者都有3个可选项,两两组合就对应9种情形,或者说一个3X3的属性矩阵。
最后,可以烘焙的光照不仅有灯光,还有自发光的物体,因此这又是一个维度。
因此与烘焙有关的有3个维度——StaticXLightX自发光,每一个维度的复杂性又各不相同,Light的属性最复杂。
二、光照贴图
最简单的光照贴图是单光照贴图(对应于Non-Directional方向模式)。在单光照贴图烘焙模式下,将不会存储光源信息,所以诸如凹凸贴图和高光这种依赖于光源方向的着色技术将无法使用,同时也意味着有更少的贴图需求,只要有一张贴图即可。
2.1 测试烘焙场景
烘焙之前,渲染路径设置为前向通道,烘焙会产生光照贴图,同时还会产生一个LightingData.asset文件。这个文件里不仅有光照贴图的信息,还可选性地包括GI以及与Light Probes的信息。
2.2 烘焙之后的场景
如上图所示,除动态自发光材质以及Realtime和Not Important光源之外,其他的光照都会被烘焙,(动态物体的光源,也会被烘焙到静态地面上)。
2.3 双光照贴图
这种模式采用了另一张贴图来存储主光源在每一个点的方向以及一个比例因子。这个比例因子用来控制光照贴图中的能量有多少来自于这个主光源所在的方向。所谓每一个点就是使用光照贴图的UV在光照贴图中采样到的像素点。因为在每一个像素点存在主光源方向,所以法线贴图可以用来和光照贴图中的数据进行光照计算。
三、在效果和性能间进行权衡
这个问题在资源受限的地方尤为突出,如web端和移动端。
3.1 影响全局的Resolution选项
在Lightmapping Settings一栏,有些设置是影响烘焙的时间和精度的,还有些影响的则是最终光照贴图的大小。Lightmmaper有两个选项,这里使用Enlighten,其他的参数如果带有Lightmap字眼,则和最终的光照贴图大小、数量以及精度有关。Lightmap Size决定了一张光照贴图的最大尺寸。如果Lightmap Resolution确定,当一张光照贴图不能放下所有静态物体的信息时,则会创造更多张光照贴图,以便保持被烘焙物体的光照贴图分辨率。Lightmap Padding则决定了在光照贴图中两个不同物体相互之间的最小像素间距。
其他参数决定的则是线下烘焙时长和GI的细分程度。
3.2 单个物体的选项
除Lighting面板之外,单个物体也有和光照烘焙相关的参数,这些参数现在位于Mesh Renderer复选框下面:
Scale In Lightmap参数还可以有选择地让某个被烘焙的物体对应的贴图部分变小。如果觉得地面不重要,可以让它的光照贴图部分变小。如果觉得某个光源比较重要,Prioritize Illumination选项可以告诉unity在计算光照的时候总是将它计算在内。Prioritize Illumination选项在实时GI计算中比较有意义。
如果想在不同的场景甚至不同的工程中使用相同的烘焙参数,那么还可以像创建预制件(prefab)一样创建Lightmap Parameters。也可以在Lighting面板中单机Lightmap Parameters下拉列表。
版权声明:本文为CSDN博主「小橙子0」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cgy56191948/article/details/103678979