UE4学习笔记:光照及阴影各自的特性和之间的区别。


本随笔介绍UE4光照移动性(Mobility)属性的特点和之间的区别。该笔记整理自官方在线教程:光照基础概念和效果。

本随笔作者还在学习阶段,对UE4引擎的理解和使用还不够透彻,难免出现书写上和技术上的问题,若出现了类似的问题欢迎在评论区和私信与我讨论。

目录
  • 光照的分类
    • 静态光照(Static Light)
    • 可移动光照(Moveable Light)
    • 固定光照(Stationary Light,又译“静止光照”)
  • 阴影的分类
    • 级联阴影贴图(Cascaded Shadow Maps)
    • 距离场阴影(Distance Field Shadow)
    • 距离场环境光遮蔽(Distance Field Ambient Occlusion)
    • 关于使用光源和阴影的小技巧
  • 光照及阴影相关的知识

光照的分类

UE4引擎里的光源根据其可移动性可分为静态(Static)光源、固定(Stationary)光源和可移动(Moveable)光源,其中固定光源和可移动光源同属于动态光源。

静态光照(Static Light)

  • 运行过程中不可更改光源的位置和颜色。
  • 需要对场景进行烘焙才能看到光照的效果。
  • 不会对渲染产生任何性能开销,因为该类型的光源生成的光照和阴影都是被烘焙到了贴图里。
  • 支持全局光照。
  • 会产生光线反射,因此在全黑空间里面的静态光照能够照亮其他地方。
  • 产生的阴影轮廓最模糊。
  • 产生的阴影是静态的,就算遮挡的物体正在移动,阴影也不会有任何变化,因为阴影被提前烘焙到了贴图里面。

可移动光照(Moveable Light)

  • 运行过程中不可以更改光源的位置,但是可以更改光源的颜色,但是需要注意的是该颜色仅仅影响直接光照,不能影响到间接光照(如反射的光照),因为间接光照是烘焙出来的。
  • 不需要对场景进行烘焙就能看到效果。
  • 对渲染产生的性能开销取决于场景里面放置的可移动光源数量,数量越多,开销越大。
  • 不支持全局光照。
  • 不会产生光线反射,因此可移动光源不会照亮拐角处的场景。
  • 会自动生成级联阴影贴图(Cascaded Shadow Map)。
  • 产生的阴影轮廓很锐利。但是不够准确,容易穿帮。效果介于静态光照和固定光照之间。
  • 产生的阴影会随着遮挡物体的变化而变化。

固定光照(Stationary Light,又译“静止光照”)

固定光照结合了静态光照和可移动光照的特点。

  • 运行过程中可以更改光源的位置和颜色。
  • 需要对场景进行烘焙才能看到最终的光照效果。
  • 会对性能产生开销,取决于场景里面固定光源的数量,但是需要额外注意一点的是,在一个空间范围内最多只能够放置四个固定光照,当放置第五个固定光照的时候,会有一个固定光照失效,因为固定光照会产生阴影贴图,阴影贴图最大只支持四个通道。当固定光源在场景里面的图标上出现了一个红色的“X”,表明该固定光源失效,需要删除掉多余的光源或者将其移动到该范围以外。
  • 支持全局光照。
  • 会产生光线反射,这点和静态光照一致。
  • 会自动生成级联阴影贴图(Cascaded Shadow Map)。
  • 产生的阴影轮廓最锐利,效果是三种光照类型中最好的。
  • 产生的阴影会随着遮挡物体的变化而变化。

阴影的分类

UE4引擎里面的阴影可分为级联阴影贴图(Cascaded Shadow Maps)、距离场阴影(Distance Field Shadow)和距离场环境光遮蔽(Distance Field Ambient Occlusion)。

级联阴影贴图(Cascaded Shadow Maps)

  • 将多层阴影结合在一起,然后根据距离摄像机的位置进行切换。
  • 固定光照和可移动光照可使用。
  • 默认启动。
  • 阴影是动态的。

距离场阴影(Distance Field Shadow)

  • 距离场是对模型的近似模拟,模拟信息会存储在体积纹理里面,它会为每个模型生成一张纹理,这张纹理就是体积纹理,并用这张体积纹理来模拟模型,和模型本身比起来它非常不准确,但是对于阴影来说已经足够准确了,因此可以极大地提升性能。
  • 固定光照和可移动光照可使用。
  • 默认不启动,需要在“项目设置(Project Settings)->引擎(Engine)->渲染(Rendering)->光照(Light)->生成网格体距离场(Generate Mesh Distance Field)”设置里勾选来启用。
  • 阴影是静态的,哪怕物体正在运动(这点和静态光照生成的阴影效果是一致的,除了阴影效果不好以外)。

距离场环境光遮蔽(Distance Field Ambient Occlusion)

  • 通过距离场网格体模拟光线反射,以及环境光遮蔽效果,但是由于距离场网格体本身并不准确,因此模拟出来的效果并不好。
  • 仅支持可移动光照,而且限定于天空光照类型。
  • 默认启动。
  • 阴影是静态的。

关于使用光源和阴影的小技巧

  • 近处使用级联阴影贴图,远处使用距离场阴影。
  • 如果是一个大型室外场景,并且有很多的动态光源,建议使用距离场环境光遮蔽。
  • 定向光源应该设置成固定光源,以获取最好的品质。
  • 小型模型应该将其光照贴图分辨率大小设置的小一些,比如说16、32、64或128,因为这些模型的阴影不需要很大,而且如果场景里面所有模型的光照贴图分辨率都很大的话,内存空间会非常吃紧。
  • 通过“光照贴图密度(带光照(Lit)->优化视图模式(Optimization Viewmodes)->光照贴图密度(Lightmap Density))”可以直观的查看每个模型使用的光照贴图分辨率大小,分辨率越大,模型对应的颜色越红,分辨率越小,模型对应的颜色越蓝。
  • 可以在“世界设定(World Settings)->lightmass”里面勾选“使用环境光遮蔽(Use Ambient Occlusion)”来启用环境遮蔽功能,给场景提供更多的细节。
  • 可以在“世界设定(World Settings)->lightmass”里面禁用“压缩光照贴图(Compress Lightmap)”以便获得更好的品质。但一般只有在开发建筑可视化项目时候才禁用,开发游戏的时候建议启用这个功能,不然的话内存开销会特别的大。

光照及阴影相关的知识

  • Lightmass是一套UE4引擎提供的光照系统。
  • 光照贴图(Light Maps,又译“光照映射”)是由Lightmass生成的一系列光照纹理。光照贴图是由光照系统采集颜色和阴影的图像,然后与模型的纹理进行相乘的结果。
  • 生成光照贴图需要模型具有通道索引为1(初始索引为0)的UV坐标,如果模型没有该UV坐标的话可以通过在静态网格体编辑器里勾选“LOD 0->构建选项(Builds Settings)->生成光照贴图UV(Generate Lightmap UVs)” ,然后点击“应用修改(Apply Changes)”来生成光照贴图UV。