## 前言 动态光照需要使用多种照明技术协同工作,这一点与只需要LightMass的静态光照不同。所以这一章,我将会总结一些有关动态光照相关的参数、使用场景与设置技巧。 ### Daedalus51的流程 #### 1.2章节的流程 1. 去除干扰场景光照的后处理效果(本系列第一篇文章) 2. 检查贴图的固有色是否正确并进行调整。(本系列第一篇文章) 3. 调整天光以符合设计目标。(本系列第一篇文章) 4. 分别开启Visualize Distance Field Ambient Occlusion、Visualize Mesh Distance Field检查距离场以及对应效果。 5. 设置曝光相关属性。 6. 设置方向光与其他主光源的基础属性(方向、亮度等) 7. 给场景中的带有反射属性的物体添加反射球并调整属性。(Daedalus51的流程中没有关闭空间反射,如果你按照我之前写的关闭空间反射,这里要记得开启)之后开启Reflections模式查看场景反射情况。 8. 添加补光灯光,以及伪造灯光来增加气氛 9. 放置高度雾。(雾可以改变场景色调) 10. 后处理调色。 **如何补光**
使用 关闭Cast Shadow、Min Roughness为1的点光源进行补光。这种灯光十分柔和,可以用于提亮局部死黑部分。配合Light Channel可以只对某一些物体起作用。 **阴影建议**
如果灯光开启了动态阴影,那么请不要使用点光源,而需要使用聚光灯。Daedalus51的理由是:点光源会向6个方向投射阴影(类似Box),对性能消耗较大。(但事实上因为Ue4光照缓存机制,所以只有第一次渲染才会有如此大的消耗) 当若干几个物体较黑时可以考虑使用聚光灯,并且设置Min Roughness为1,这样可以达到提亮物体的作用。 ### 调试用命令 - r.Shadow.MaxResolution 可选参数256~2048默认2048 - r.Shadow.MinResolution 可选参数16~128默认32 - r.Shadow.FadeResolution 可选参数64~2048默认64 - r.Shadow.DistanceScale 可选参数0.5~2默认1 - r.Shadow.RadiusThreshold 可选参数0.01~0.5默认0.03 - r.Shadow.CSM.MaxCascades 可选参数1~16默认3 - r.Shadow.CSM.TransitionScale可选参数0~2默认1 - r.ShadowQuality 可选参数1~5默认5 - r.LightFunctionQuality 可选参数0~2默认2 - r.DistanceFieldShadowing True~False默认True - r.DistanceFieldAO True~False默认True - r.ParticleLightQuality 可选参数0~2默认1 - r.Shadow.UnbuiltPreviewInGame - r.Shadow.UnbuiltNumWholeSceneDynamicShadowCascades - r.Shadow.MaxCSMResolution - r.CapsuleShadows 更多技巧请参考第二章的《有关Console命令的技巧》段落。 ### 级联阴影(Cascaded Shadow Maps) 级联阴影分为近阴影与远阴影。两者皆可以设置数量、过度距离以及过度参数(在光源中设置)。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/级联阴影.png) 级联阴影技术介绍:https://gameinstitute.qq.com/community/detail/117522 下面这部分内容总结于《Lighting Troubleshooting Guide》,部分条目的解释有配图,我也懒得贴了,所以推荐直接看原文。
https://wiki.unrealengine.com/LightingTroubleshootingGuide ##### 方向光特有属性 ###### Dynamic Shadow Distance Movable 以摄像机为起点的阴影覆盖距离,该值为0则代表禁用该功能。 ###### Dynamic Shadow Distance Stationary 以摄像机为起点的阴影覆盖距离,该值为0则代表禁用该功能。 ###### Num Dynamic Shadow Cascades view frustum被分割成的级联的数量。更多的级联将导致更好的阴影分辨率,但会显著增加渲染成本。 ###### Cascade Distribution Exponent 控制级联的分布,是离相机更近(高值)还是更远(低值)。值1表示转换将与分辨率成正比。 ###### Cascade Transition Exponent 级联之间的过度参数,较低的数值产生会较生硬的过度,而较高的数值会产生较平缓的过度。 ###### Shadow Distance Fadeout Fraction 阴影淡出参数。较高的值会使阴影显得较淡一些,而较低的值会使阴影显得较深一些。 ##### 对于所有的动态光源 ###### Shadow Bias 控制阴影在场景中的精确程度。默认值是0.5,这是权衡了精度与性能的值。 ###### Shadow Filter Sharpness 控制阴影边缘的锐化程度。 #### 调整级联阴影以得到更好的效果 通过调整上述设置,可以很好地调整阴影的出血值和精度。下一节将尝试调整到最佳成都,以获得更好的精度与阴影。找到一种适合任何特定游戏的平衡将需要耗费时间、精力来进行大量测试。 以下是默认设置下会出现的问题。 ![image](https://d26ilriwvtzlb.cloudfront.net/a/ae/1AdjustingSettings2_ProblemAreas.png) 调整后的结果 ![image](https://d26ilriwvtzlb.cloudfront.net/8/8c/1AdjustingSettings2_finalResult.png) #### 远距离阴影(Far Shadow) 一般是方向光作用在地形上的阴影,使用的是Cascaded Shadow Maps。
相关选项有:
方向光源-》Cascaded Shadow Maps-》 Far Shadow Cascade Count(阴影精细程度)与Far ShadowDistance(显示距离) 地形是默认开启Far Shadow的。如果想对Actor启用则需要手动开启。 #### 级联阴影调试 可以通过show=》advanced=》ShadowFrustums显示阴影调试(只对方向光有效)。以此可以观察Cascaded的级数切换距离。 ### 距离场光线追踪技术 级联阴影在显示远阴影时为了效果会增加阴影级数这样会增加消耗,而距离场阴影的消耗相对较小,所以会采样近距离级联远距离距离场阴影的配合方式。同时它可以解决因为屏幕空间渲染技术而导致的阴影失真的问题。另一个主要用处就是距离场AO了。或者可以使用距离场来写Shader。 注意:距离场技术只适用于Static Mesh。 ### 如何开启 首先需要开启距离场生成,在项目设置——渲染——灯光——勾选 生成模型距离场 选项。 之后在需要的灯光处勾选“Ray Tracing Distance Field Shadow”选项开启。 ### 距离场检查 距离场的构建质量将决定距离场相关技术的渲染效果。距离场分为模型距离场与全局距离场。你可以通过在Show > Visualize >中勾选Global Distance Field、Mesh Distance Field、Distance Field Ambient Occlusion来对渲染效果进行debug。尤其是AO,一下子就能找到效果不好的地方。 Daedalus51推荐给这些选项设置快捷键来提高效率。在编辑器设置中搜索:Visualize Global Distance Field、Visualize Mesh Distance Field、Visualize Distance Field Ambient Occlusion后设置快捷键即可。 如果距离场效果不佳,可以在对应StaticMesh编辑器中设置Distance Field Resoulition Scale来调高分辨率(记得按Apply Changes) ### 距离场模型问题 因为距离场使用体积贴图来存储空间信息,所以对于巨大物体(比如摩天大楼)应该把模型拆成小块,以减少性能损耗。 同理,模型的形状也不应该奇形怪状,这样会大大的影响距离场构建质量。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/模型形状不佳而导致距离场构建不佳.png) ### 植被渲染注意 因为植被面数高、结构复杂等因为因素,不适合使用LightMass、SSAO进行渲染,但距离场AO却十分适合。 对于树叶等需要双面渲染的物体,需要在模型设置中勾选Two-Sided Distance Field Generation,以生成正确的距离场。 ### 级联阴影切换 可以对灯光中的Cascaded Shadow Maps——Dynamic Shadow Distance MoveableLight进行设置,来达到级联阴影与软阴影的切换(靠近物体会切换成级联阴影) 取值可以参考静态光照的Dynamic Shadow Distance属性。 ### 其他注意事项 光源中的SourceRadius、SourceLength、LightSourceAngle会对软阴影产生影响(学过光追的人都知道为什么) 天光也有距离场AO的选项,千万别忘记了。 ## 胶囊阴影 这是骨骼物体的软阴影方案,所以光源的SourceRadius、SourceLength、LightSourceAngle选项也会对此产生影响。 - Capsule Direct Shadow:此属性将启用来自直接(可移动)光照的柔和阴影。 - Capsule Indirect Shadow:此属性将启用来自预计算光照(光照图和天光)的柔和阴影。 - Capsule Direct Shadow Min Visibility:调整胶囊阴影的明暗度 ### 如何启用 1. 在角色Asset中指定ShaowPhysicsAsset。 2. 在角色Asset的Lighting选项卡中勾选Capsule Direct Shadow或者Capsule Indirect Shadow ### 接触阴影(Contact Shadows) 是一种为了弥补级联阴影的缺陷,用于补充角色细节、场景细节阴影的技术。它是一种根据深度信息进行着色的后处理渲染技术。 ContactShadowLength参数大于0时就会开启,默认是关闭的。。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/接触阴影.png) https://docs.unrealengine.com/zh-CN/Engine/Rendering/LightingAndShadows/ContactShadows/index.html #### 原理 将接触阴影的长度设为大于零的值后,渲染器将通过场景的深度缓存从像素的位置到光源进行光线追踪。举一个典型的例子来说,将接触阴影长度的最大值设为 1,此处的 1 则代表光线遍历整个屏幕。而将接触阴影长度的值设为 0.5 则意味着光线遍历半个屏幕。注意:场景深度缓存中的获得的采样将保持不变,意味着增加接触阴影的长度时将出现更多噪点(穿帮)。长度为 0.75 的接触阴影比长度为 0.1 的接触阴影生成的噪点更多。 #### 应用场景 1. 当前平台只支持一个光源,且需要使用Marching实现的视差Shader。 2. 角色细节阴影与墙面植物(爬山虎)阴影。 ### Light Propagation Volumes ### HDRIBackdrop 4.23的新功能,这个东西会把地面部分的HDR投射到一个平面上,这样场景中物体的阴影就可以投射到“HDR背景上”。适合于产品展示。奥秘就在这个环境球上。 当然Engine还提供了其他环境球可以根据需要选择。如何选择请参考文档:https://docs.unrealengine.com/4.27/en-US/BuildingWorlds/LightingAndShadows/HDRIBackdrop/ 不过使用的时候需要注意以下设置: - HDR贴图设置:最大纹理尺寸(Maximum Texture Size)应与已导入HDR图像的较大分辨率值匹配。 - 应将 Mip生成设置(Mip Gen Settings)设为NoMipmaps以使用完全品质。 - 调整Hdr Size(拍摄场景的大小) - 如果原始设置下,如果摄像仪偏离Projection Center点,远处的背景就会产生形变,解决的方法是勾选Use Camera Projection选项