LightMap

渲染类型

image-20241112105621401

Lighting设置

在比较新的版本中,Lighting中的设置位置发生的变化,需要通过Windows-》Rendering进入,按照图示前往

image-20241112110331875

image-20241112110246754

skybox:环境光是天空盒的颜色

Gradient:对天空,中间,大地的颜色做了一个详细的区分

color:单一颜色代表环境光

反射光的选项

image-20241112141637421

实时光和烘焙光各自的控制

image-20241112141749786

实时光照GI

启用

在2023.2版本中,一个场景需要新建一个LightAssets,然后才能对这些数据进行修改

将场景中的需要进行实时光照贴图渲染的游戏对象在设置窗口右上角的Static选项框中勾选下图所示的左侧有对钩的选项就可以启动光照贴图,然后再去Lighting窗口中点击最下面的 Generate Lighting选项就能生成实时光照贴图,需要注意场景中的需要进行实时光照贴图的灯光的选项也应该是RealTime

image-20241112145408506

实时光照贴图有一定的精度区分,在Lighting的设置中,下图红框所所示的数字就是实时光照贴图的精度,这个值越大,贴图越精细

image-20241112145201797

image-20241112145157361

参数

image-20241112151107945

  1. Directional Mode:直射模式
  2. Albedo Boost:间接光照的强度
  3. Indirect Intensity:光的发射率,金属材质就稍微调高
  4. LightMap Parameters:对光照贴图进行设置

GIcache

image-20241112150346082

实际上实时光的光照贴图是一种预计算技术,在游戏过程中如果场景发生变化,会根据保存在GIcache中的数据进行计算

MixedGI

取消Lighting设置的RealTime,并将灯光的Mode设置为Mixed,并且,这里的结果都写死的,并不是实时光照中的参考计预计算

补充一些知识,选用Subtractive技术,静态物体的阴影不会作用在动态物体上,需要使用Light Props或者被称为光照探针等一些技术

手游使用Subtractive技术偏多,Unity推荐使用ShadowMask

这里有三种光照模式提供选择

Mixed Lighting:

Bake Indirect:只烘培间接光照,直接光以及阴影进行实时计算。运行时改变灯光,直接光照和阴影就会变,但间接光不变(如果间接光弱,视觉影响不大)。只减少间接光照的实时计算,适合对光照要求较高的场景,内存消耗小,当然性能的消耗也大。

shadowmask:对静态物体直接光照产生的阴影也会被烘培到ShadowMask中,动态物体不受影响。运行时改变灯光只有间接光照和静态物体的阴影不受影响。内存中多了一份Shadowmask,比上一部少了静态物体阴影的计算,占用性能小了一点。在2023版本中,需要对在ProjectSetting中的Quality下的ShadowMask Mode进行一个设置,默认开启的是DistanceShadowMask,要实现上述描述的效果,要调整为ShadowMask,同时在该模式下还具备Shadow Distance的属性设置,在摄像机多少距离内才产生阴影。下面给出正式的解释

单就阴影来说

  • 当Bake过后光源没有发生变化的时候,两者区别不大(就是工作方式有些区别)

  • 当Bake过后光源变化了的时候,两者区别明显

    在Distance之外,两种模式没有区别,距离外动态物体都不能投射阴影,静态物理都靠预先计算的结果。

    在Distance之内,DistanceShadowMask,使用ShadowMap实时计算动态物体静态物体阴影。而ShadowMask 只实时计算动态物体的阴影。

substrative:静态物体:直接光和间接光都烘焙到光照贴图中;动态物体:接收直接光,可以在静态物体上投射主方向光的阴影。运行时改变光照,静态物体直接光、间接光、阴影不受影响,动态物体的直接光、主灯光(平行光)投射的阴影受影响、其他灯光无阴影。性能消耗最小,应用广。

参数解释

参照图片

image-20241112171755390

Lightmapper (Progressive Cpu)

Prioritize View :烘培的先后顺序,先烘培摄像机视锥体里面已经启用的元素,然后在烘培视锥体以外的。

Direct Samples: 直接光照采样数量 影响质量、速度

Indirect Samples :间接光照采样数量 影响质量、速度

Enviroment Samples:环境光采样数量 影响质量、速度

Bounces: 间接光的反射次数。跟踪路径时要执行的间接反弹次数。 对于大多数场景来说,两次反弹就足够了。 对于一些室内场景,可能需要更多。

Filtering:滤波

  1. Direct Denoiser:减少直射光噪点。
  2. Direct Filter:直射光滤波。None:无。Gaussian:高斯滤波器。A-Trous:A-Trous滤波器。Indirect Denoiser:减少间接光噪点。
  3. Indirect Filter:间接光滤波。None:无。Gaussian:高斯滤波器。A-Trous:A-Trous滤波器。 Ambient Denoiser:减少环境光噪点。
  4. Indirect Filter:环境光滤波。None:无。Gaussian:高斯滤波器。A-Trous:A-Trous滤波器。

Indirect Resolution:使用此值指定用于间接照明计算的每个单元的纹理元素数。 增加此值可提高间接光的视觉质量,但也会增加烘烤光照贴图所需的时间。 默认值是2。

Lightmap Resolution:使用此值指定用于光照贴图的每个单位的纹理像素数。 增加此值可提高光照贴图质量,但也会增加烘烤时间。 默认值是40。

Lightmap Padding:使用此值可指定烘焙光照贴图中不同形状之间的分隔(以texel为单位)。 默认值是2。

Lightmap Size:光照贴图大小。

Compress Lightmaps:压缩的光照贴图需要较少的存储空间,但压缩过程会将不需要的视觉效果引入到纹理中。 选中此复选框可压缩光照贴图,或取消选中它以保持其未压缩状态。 该复选框默认打勾。

Ambient Occlusion:允许您控制环境遮挡中表面的相对亮度。 较高的值表示遮挡区和全亮区之间的较大对比度。 这仅适用于由GI系统计算的间接照明

Directional Mode:可以设置光照贴图来存储关于物体表面上每个点处主导入射光的信息。

Directional:在方向模式下,会生成第二个光照贴图来存储入射光的主要方向。 这允许漫射法线贴图材料与GI一起工作。 定向模式需要大约两倍的额外光照贴图数据的存储空间。 定向光照贴图无法在SM2.0硬件或使用GLES2.0时解码。 他们将回退到非定向光照贴图。

Non-directiona:无方向模式。

ndirect Intensity:控制实时存储的间接光照和烘焙光照贴图的亮度,亮度值介于0和5之间。大于1的值会增加间接光的强度,而小于1的值会降低间接光的强度。 默认值是1。

Albedo Boost:控制通过强化场景中材质的反照率来控制表面之间反射的光量,数值介于1和10之间。增加此值可将反射率值绘制为白色以进行间接光线计算。 默认值1是物理上准确的。

Lightmapper (Enlighten)

  1. Indirect Resolution:间接光照分辨率,数值越高,光照细节越高
  2. Lightmap Resolution:光照贴图分辨率(每单位长度多少体素),通常设置为Indirect Resolution的10倍左右
  3. Lightmap Padding:修正两个物体的Lightmap之间的距离,以避免颜色渗透
  4. Lightmap Size:光照贴图大小
  5. Compress Lightmaps:是否压缩光照贴图
  6. Ambient Occlusion:是否烘焙环境光遮罩
  7. Final Gather:是否对最后一次GI光线反射后的光照结果再进行一次FG计算,勾选上会有较好的质量表现,但烘焙时间会增加
  8. Directional Mode:可以设置光照贴图来存储关于物体表面上每个点处主导入射光的信息。
  9. Directional:在方向模式下,会生成第二个光照贴图来存储入射光的主要方向。 这允许漫射法线贴图材料与GI一起工作。 定向模式需要大约两倍的额外光照贴图数据的存储空间。 定向光照贴图无法在SM2.0硬件或使用GLES2.0时解码。 他们将回退到非定向光照贴图。
  10. Non-directiona:选它。不要考虑。
  11. Indirect Intensity:间接光照的强度
  12. Albedo Boost:控制通过强化场景中材质的反照率来控制表面之间反射的光量,数值介于1和10之间。

补充知识

同时开启实时实时光照GI和BakeGi

起到决定性作用的是光源的mode

在Shader中的运行

统一是SurfaceShader中根据设定自动生成的

顶点着色器中的设置

1
2
3
4
5
6
#ifdef DYNAMICLIGHTMAP_ON //实时光照GI
o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
#endif
#ifdef LIGHTMAP_ON//bake光照GI
o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#endif

片元着色器中的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Setup lighting environment
UnityGI gi;
UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
gi.indirect.diffuse = 0;
gi.indirect.specular = 0;
gi.light.color = _LightColor0.rgb;
gi.light.dir = lightDir;
// Call GI (lightmaps/SH/reflections) lighting function
UnityGIInput giInput;
UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
giInput.light = gi.light;
giInput.worldPos = worldPos;
giInput.worldViewDir = worldViewDir;
giInput.atten = atten;
#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)
giInput.lightmapUV = IN.lmap;
#else
giInput.lightmapUV = 0.0;
#endif
#if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL
giInput.ambient = IN.sh;
#else
giInput.ambient.rgb = 0.0;
#endif
giInput.probeHDR[0] = unity_SpecCube0_HDR;
giInput.probeHDR[1] = unity_SpecCube1_HDR;
#if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION)
giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending
#endif
#ifdef UNITY_SPECCUBE_BOX_PROJECTION
giInput.boxMax[0] = unity_SpecCube0_BoxMax;
giInput.probePosition[0] = unity_SpecCube0_ProbePosition;
giInput.boxMax[1] = unity_SpecCube1_BoxMax;
giInput.boxMin[1] = unity_SpecCube1_BoxMin;
giInput.probePosition[1] = unity_SpecCube1_ProbePosition;
#endif
LightingStandard_GI(o, giInput, gi);

// realtime lighting: call lighting function
c += LightingStandard (o, worldViewDir, gi);
UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fog
UNITY_OPAQUE_ALPHA(c.a);