## 天光 天光亮度一般来说还是保持为1比较好,但以天光作为主要照明是例外(夜晚场景)。 天光有“场景捕获”与“使用CubeMap”两种使用方向。(但是本质上还是围绕着CubeMap,所以作者更加倾向于使用CubeMap。除非你实现了类似CryEngine的昼夜交替系统。) Daedalus51在视频1.1最后讲解了Skylight技巧,推荐大家去看。 ### 调试方法 往场景中放入一个Sphere与Cube模型,并赋予Chrome材质(引擎Content中)。假设你已经关闭后处理空间中的屏幕空间反射效果。这样就可以观察天光是否达到你的要求。 在静态光照下,LightMass会烘焙出GI效果,你可以开启LightingOnly模式查看GI效果。 ![image](https://docs.unrealengine.com/4.27/Images/BuildingWorlds/LightingAndShadows/LightTypes/SkyLight/SkyLight_1.webp) ### 使用CubeMap 也就是使用Hdr环境贴图,赋予Hdr后,记得修改CubeMap Resolution(贴图最长边的值,必须为2的幂)。 ### 场景捕获 对远景与环境球进行采样,再作为天光数据对场景进行照明。 如果你希望把Hdr图作为环境球在场景中渲染,那步骤如下: 1. 往场景中加入环境球模型,想省事可以使用EngineContent中的SM_SkySphere。 2. 使用以下材质(这里我就直接拿日天大佬的图来展示): ![image](https://pic1.zhimg.com/80/v2-6cb7ed806245a4ef264b909e67fd29a8_hd.jpg) 另外材质的光照模型选择自发光,勾选双面渲染选项。 3. 设置Sky Distance Threshold属性并调整环境球模型(默认的SM_SkySphere太小了)。 4. 关闭模型的Cast Shadow选项。 5. 点击SkyLight标签中Recature按钮(你可以在蓝图调用RecaptureSKy函数来进行更新)。 使用Exr贴图来制作天空球材质,好处在于不需要使用材质中的旋转节点,直接连入自发光节点即可。同时可以通过旋转模型来旋转天空球。 #### 其他参数说明 **Sky Distance Threshold**:当物体处于该数值半径外时(天光Actor为坐标为原点),天光会对该物体进行采样。 **Capture Emissive**:仅对自发光材质进行采样,以减少性能消耗。当使用采集每一帧(Capture Every Frame)时,建议使用此方法。 **更新天光**需要点击SkyLight标签中**Recature**按钮。 ### 下半球颜色控制 在场景中使用了环境球或是默认场景蓝图天球,并且天光使用场景捕获时,我们只需要上半球的光照(照亮场景),而下半球的颜色往往会造成“天光漏光”的问题(天光不能穿过地面对物体进行照明)。此时我们就需要勾选“Lower Hemisphere Is Solid Color”选项,并且将“Lower Hemisphere Color”设置为黑色。 在Daedalus51的视频中,他展示了另一种使用思路。首先他的场景中是有一大片草地的,如果Lower Hemisphere Color使用黑色,其实是不正确的。于是他使用PS对开启BaseColor模式的场景进行均匀取色(均匀模糊后再取色)。再用该颜色设置Lower Hemisphere Color的值。这样效果会更加真实一些。 但也有例外情况,比如汽车等机械产品展示。一般来说这类项目一般会采用**影棚Hdr贴图**,此时就需要关闭“Lower Hemisphere Is Solid Color”选项。因为底部的光照效果我们也是需要的。 ### 距离场AO 《Lighting with Unreal Engine Masterclass》视频中有提到,天光的AO也是距离场AO的重要组成部分。所以如果你要使用距离场AO,别忘记天光部分。(记得开启AO与距离场观察模式查看其质量) 视频偏后段展示了通过设置AO颜色来模拟GI效果,不过本人不太推荐使用。 ### 动态天光注意事项 如果你的天光是动态类型的,那就需要开启距离场阴影相关功能,不然天光是不会投射阴影的。 ### 天光反弹反弹(静态光照有效) 在世界设置中可以设置天光的反弹次数,提高反弹次数以提高效果。 ## 动态环境球效果 在Daedalus51的4.6章节视频中,他演示一种动态环境球效果: ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/Unreal4DynamicSky.gif) 如果在云层移动速度较慢的情况下,效果还不错。以下是材质实现: ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/SkyMaterial.png) 作者在其基础上进行了一定改进,但是环境球的顶部会有图像畸变bug。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/Unreal4dynamicSky.png) ## 调整曝光与ToneMapping 1.2 21min左右开始讲解有关曝光的知识,这里强烈建议看一下。不过需要注意该视频制作时,虚幻引擎还没有加入物理灯光。 https://www.bilibili.com/video/av59548243/?p=2 刚发现官方已经做了曝光功能的解析视频。强烈推荐去看一下。 https://www.youtube.com/watch?v=Q1xi8NwpIqA >核心思想在于:因为前人已经积累了大量的摄影知识与经验,所以我们没有必要光靠感觉来设置灯光亮度与曝光度,而需要使用摄影标准来设置灯光,从而使得场景更加真实。 ### 恶补相关知识 这里我推荐看一下日天大佬文章与Wiki,可以恶补相关知识。
虚幻中灯光的物理单位计算公式: https://zhuanlan.zhihu.com/p/69248316 公式推导: https://zhuanlan.zhihu.com/p/69348892 只需要知道```$E=3.14\times2^{EV}$```就可以了 物理灯光文档 https://docs.unrealengine.com/zh-CN/Engine/Rendering/LightingAndShadows/PhysicalLightUnits/index.html 曝光值 https://en.wikipedia.org/wiki/Exposure_value ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/35F7CFB7707F4C8699720C28F3409060.octet-stream) Sunny16 https://en.wikipedia.org/wiki/Sunny_16_rule EV使用推荐 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/Sunny16.png) ### 操作过程 #### 调整曝光 在设置天光与其他主光源亮度前,需要确定好曝光值。在1.2节27min左右Daedalus51打开Visualize——HDR(人眼适应),通过该工具来查看亮度分布、以及亮度调整情况情况。以此来调节后处理空间中的曝光度范围。(调整曝光范围:0.03~2 => 0.4~2) #### 开启ToneMappering 1.2章节34min处,这段ToneMappering介绍这段推荐只看英文字幕。 Daedalus51通过命令行查看是否开启ToneMappering,输入r.TonemapperFilm,可以查看是否开启ToneMappering功能。(0为关闭,1为开启)输入r.TonemapperFilm 1就可开启ToneMapper功能。 Daedalus51之后调整了ToneMapping曲线(在后处理的PostProcess-Film中),不过个人不建议调整,除非对调色十分了解。 ##### 有关Console命令的技巧 这里几个操作都与Console命令有关,所以介绍一下Daedalus51介绍的技巧: **查看所有命令详细信息**:在Ue4编辑器窗口中点击Help-ConsoleVariables,就可以得到console命令表,可以查看详细说明。 **在项目启动时默认执行一些命令** 在项目目录的Config文件中DefaultEngine.ini(/Script/Engine.RenderSettings)中输入命令。例如:r.SSS.Quality=4 ##### 有关其他后处理效果 因为ToneMappering会影响到后处理中调色效果,所以Daedalus51推荐使用Lut来做后处理。 ## 本人对于曝光的看法 本文主要是以笔记的形式来记录在视频中所学习到东西,所以比较杂乱。因为在看完所有视频与资料后,我在此总结一下我对曝光的看法。 在物理灯光换算方面,日天大佬花费大量功夫整理出一张换算表,这样是效率最高的工作方法。当然我是一个嫌麻烦的人,也没有时间仔细研究这些东西,还是使用Unreal4的像素检测器直接检测亮度比较方便。 对于曝光,我大致有两种方案: ### 以EV0作为基准的 一个是以EV0作为基准来调整场景灯光的传统方法。之后再通过曝光换算公式将实际灯光亮度转化为EV0的亮度,最后再调整自动曝光范围。但这样也就是失去了物理灯光的意义了。 虽然“虚幻争霸”是采用这种曝光方案来布置灯光。但Unreal4马上就要推出物理大气,同时“堡垒之夜”中已经使用了日天系统(Sun And Day),可以说“物理化”是一个势在必行的趋势。 ### 以真实环境EV作为基准 一个是根据场景的环境特征确定EV,使用真实灯光的亮度数据。因为是真实世界测量出的数据,所以你可以很容易且快速精准地做出逼真效果。相当适合于建筑室内设计等需求照片级渲染质量需求。 #### 解决场景HDR差距较大所产生光照问题 以上两种方案都需要解决场景动态范围差距较大所产生的暗部亮部效果无法兼顾的“问题”。 严格的说这不能算是一个问题,因为这就是正确的渲染结果。 李文磊老师在《在UE4中实现灯光之美》演讲中有说到 >以我个人经验我觉得这个发范围超过8个档位以外的像素,大家可能需要小心点,如果是0的EV基础值,低于-5.3可能会死黑,高于3可能会爆掉,这是个人的经验。 我们可以通过减少HDR插件来避免这种“问题”的产生,具体可以使用以下两种方式: **降低室外天光亮度** 降低室外主光源的亮度,来匹配室内EV。避免使用高EV的环境HDR图(比如正午大晴天)。选择低EV的环境HDR图,例如早晨无云、正午多云的环境HDR图。再使用恰当的EV范围进行自动曝光,效果就比较好了。 如果不想让用户看到自动曝光的转换过程,可以提高自动曝光速度。 **提高室内灯光亮度** 提高室内灯光的亮度,来匹配室外EV。 ![](https://cdn.jsdelivr.net/gh/blueroseslol/ImageBag@latest/ImageBag/Lighting/提高室内亮度.jpg) ### 动态环境球与天光捕获问题 上文有介绍Daedalus51的动态环境球方案。那么问题来了,天光捕获的是哪一帧的环境球?我们无法确定。那么天光烘焙结果就是不确定的么?那么TrueSky之类的RayMarching材质,天光捕获是否会正确呢? 因为本人没有TrueSky,而且这个问题也无伤大雅,所以本人就不研究了。 #### 个人对于动态天空的意见 其实本人不太喜欢Daedalus51的环境球方案,因为会穿帮。个人还是倾向于改造BP_Sky_Sphere。BP_Sky_Sphere的问题主要在云与大气上。 云的话还是推荐做成RayMarching,计算透明度与阳光散射效果(如果是不运动的云可以预计算效果) ![image](http://storage.googleapis.com/wzukusers/user-22455410/images/582eb811b16d53XZwq6l/Tracing_Shadows.gif) 大气效果应该不是物理的不然Unreal4也不会在4.24推出物理大气系统。