UE4学习笔记:基础光照入门
本随笔介绍UE4里关于光照、阴影和反射效果的特点和之间的区别。该笔记整理自官方在线教程:光照基础概念和效果。
本随笔作者还在学习阶段,对UE4引擎的理解和使用还不够透彻,难免出现书写上和技术上的问题,若出现了类似的问题欢迎在评论区和私信与我讨论。
光照的分类
UE4引擎里的光源根据其可移动性可分为静态(Static)光源、固定(Stationary)光源和可移动(Moveable)光源,其中固定光源和可移动光源同属于动态光源。
静态光照(Static Light)
- 运行过程中不可更改光源的位置和颜色。
- 需要对场景进行烘焙才能看到光照的效果。
- 不会对渲染产生任何性能开销,因为该类型的光源生成的光照和阴影都是被烘焙到了贴图里。
- 支持全局光照。
- 会产生光线反射,因此在全黑空间里面的静态光照能够照亮其他地方。
- 产生的阴影轮廓最模糊。
- 产生的阴影是静态的,就算遮挡的物体正在移动,阴影也不会有任何变化,因为阴影被提前烘焙到了贴图里面。
动态光照(Dynamical 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)
- 将多层阴影结合在一起,然后根据距离摄像机的位置进行切换。
- 固定光照和可移动光照可使用,且只能在“定向光源(Directional Light)”光源上进行设置和应用。
- 默认启动。
- 阴影是动态的。
距离场阴影(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)”以便获得更好的品质。但一般只有在开发建筑可视化项目时候才禁用,开发游戏的时候建议启用这个功能,不然的话内存开销会特别的大。
光照贴图
- 光照贴图(Light Maps,又译“光照映射”)是由Lightmass生成的一系列光照纹理。光照贴图是由光照系统采集颜色和阴影的图像,然后与模型的纹理进行相乘的结果。
- 生成光照贴图需要模型具有通道索引为1(初始索引为0,这个是模型拥有的基础UV,用于漫反射或底色,而索引1的UV用于光照贴图)的UV坐标,如果模型没有该UV坐标的话可以通过在静态网格体编辑器里勾选“LOD 0->构建选项(Builds Settings)->生成光照贴图UV(Generate Lightmap UVs)” ,然后点击“应用修改(Apply Changes)”来生成光照贴图UV,生成光照贴图之后将“常规设置(General Settings)->光照贴图坐标索引(Lightmap Coordinate Index)”属性从“0”设置为“1”,因为光照贴图的UV索引是1而不是0。在生成的光照贴图UV里每个部分之间的间隔要尽可能小,但是也不能有重叠,可以通过设置“LOD 0->构建选项(Builds Settings)->最小光照贴图分辨率(Min Lightmap Resolution)”属性然后点击“应用修改(Apply Changes)”来更改部分之间的间隔。
- “源光照贴图索引(Source Lightmap Index)”表示在没有光照贴图UV时,虚幻引擎会查看哪个UV通道来生成光照贴图UV。一般来说该属性值应该设置为模型默认纹理UV通道,也就是0,代表着使用索引为0的UV通道作为源光照贴图。
- “目标光照贴图(Destination Lightmap Index)”用于告诉虚幻引擎使用哪个通道储存新创建的光照贴图UV。一般来说该值应该设置成1,因为一般模型只会存在索引为0的通道,如果模型已存在多个UV通道,那需要将该值设置为未使用的索引值。
反射的分类
UE4提供的反射一共有四种类型:屏幕空间反射(Screen Space Reflections)、反射捕获(Reflection Captures)、平面反射(Planar Reflections)和采集到2D/立方体(Capture to 2D/Cube)。
屏幕空间反射(Screen Space Reflection)
- 默认使用的反射方式。
- 只能反射当前已渲染的画面。
- 噪点很多。
- 实时渲染。
- 像素级别的精度。
反射捕获(Reflection Captures)
- 通过拖动对应的对象(球体反射捕获或盒型反射捕获)到场景里来启用。
- 能够反射当前没有被渲染的画面。
- 噪点较少。
- 不是实时渲染,因为反射捕获仅仅只是采集一张360度的瞬时图像。
- 精度很低,反射画面的位置不能准确反应实际模型的位置。
- 默认的反射分辨率大小可能太低,因此需要到“项目设置(Project Settings)->引擎(Engine)->渲染(Rendering)->反射(Reflection)”里去增加反射分辨率。
平面反射(Planar Reflections)
- 在“项目设置(Project Settings)->引擎(Engine)->渲染(Rendering)->光照(Light)”里面开启“全局裁剪平面(Global Clip Planar)”,然后拖动平面反射到场景里面,会生成一个反射体积,该体积内的所有含反射效果的材质都能获得平面反射,但仅适用于平面效果,例如镜子。
- 能够反射当前没有被渲染的画面。
- 渲染质量可调控。
- 即可实时渲染,也可一次性捕获。实时渲染的开销非常大。
- 像素级别的精度。
采集到2D/立方体(Capture to 2D/Cube)
- 将“场景捕获2D(Scene Capture 2D)或场景捕获立方体(Scene Capture Cube)”对象放置到场景中会生成一个摄像机,为其创建一个新的“渲染目标(Render Target)”纹理并赋值到属性里面,该纹理即为该场景捕获对象摄像机拍摄下的图像,结合材质即可实现反射。
- 能够反射当前没有渲染的画面。
- 渲染质量最佳。
- 即可实时渲染,也可一次性捕获。实时渲染开销最大。
- 像素级别的精度。
雾效的分类
- UE4关于雾的效果可以分为:大气距离雾(Atmosphere Distance Fog)、指数距离雾(Exponent Distance Fog)、光束光晕(Light Shaft Bloom)、光束遮蔽(Light Shaft Occlusion)、体积雾(Volumetric Fog)和体积光(Volumetric Light)。
- 距离雾(同时也是高度雾)指的是会随着距离和高度的增加而消散的雾。
大气距离雾(Atmosphere Distance Fog)
- 不会生成雾层,但是会生成地平线。
- 属于最复杂的一种雾,有时候并不适合将其放置到关卡中。
- 性能最好的雾。
指数距离雾(Exponent Distance Fog)
- 在UE4引擎里又叫“指数高度雾(Exponent Height Fog)”。
- 能生成雾层,因为该类型的雾还是一种高度雾。
- 属于简单的雾。
- 效果最好的雾。因为能够混合更丰富的颜色种类。
光束光晕(Light Shaft Bloom)
- 可以在“定向光源(Direction Light)”的属性里启用。
- 让光束在被物体遮挡的时候体现出明亮光束的效果,即遮挡物边缘和光照形成的高亮光束。
光束遮蔽(Light Shaft Occlusion)
- 可以在“定向光源(Direction Light)”的属性里启用。
- 让光束在被物体遮挡的时候体现出暗淡光束的效果,即遮挡物边缘和光照形成的深色光束。
体积雾(Volumetric Fog)
- 可以在“指数距离雾(Exponent Distance Exponent)”的属性里启用。
- 体积雾使用的是“体积光照贴图(Volumetric Lightmap)”以便照亮自己,雾气会使用光照贴图吸收周围的颜色并反应出来。
体积光(Volumetric Light)
- 通过调节光源里的“体积散热强度(Volumetric Scattering Intensity)”属性值来实现该光源对雾气的影响,用来实现如汽车前车灯在大雾天气照射时候的效果。