雾 | 什么是雾,UE5指数高度雾、体积、游戏开发中的“雾”不简单【附:工程文件】
在大型的3D项目中都会考虑使用雾效调节画面色调、增强游戏纵深感,雾效又可细分为:
按衰减方式分为:
Linear-线性雾
Exponetial-指数雾
Exponetial Squared-指数平方雾
按距离可分为
Depth-based Fog-深度雾
Height-based Fog 高度雾
深度雾:
场景越深的地方也就是离摄像机越远的地方越浓,这里的雾深(Depth of fog=distance(cameraPos,PixelPos))在世界坐标中的距离来控制,我们通过雾Depth of Fog -->fogfactor雾效因子-->然后通过雾效因子对原来的场景颜色和雾的颜色进行混合就可以实现雾效【雾效因子计算公式有很多】有了公式
我们需要知道摄像机和像素在世界空间的距离Distance(Camerawpos,pixelwpos)我们就需要知道摄像机世界坐标和像素世界坐标,重建像素世界坐标需要深度图
后处理雾效:不受场景化复杂度影响
【https://www.bilibili.com/video/BV11k4y1h7D4?t=84.0】
#游戏中雾原理
雾效(fog)是游戏中常用的一种效果,根据远近产生不同的深度的雾效果。
这个效果涉及两个关键字
距离
颜色
在着色器中,雾效的距离,一般转成换计算雾效因素(factor_fog),这个数字范围是0-1
1 表示完全不受雾影响
0 表示完全被雾笼罩
接着再根据这个雾效因素去计算颜色,混合当前颜色color和雾factor_fog的颜色即可。
雾被引入为在图像中提供距离提示的视觉元素。事实上,雾可以快速帮助我们了解物体的距离和规模,以及世界本身

【没有雾,就不容易分辨地形的规模】

【有了雾,我们就能立即了解地形的大小】
但是我们应该注意到,雾也可以提供更多的信息。例如,雾的颜色可以告诉我们太阳的强度。
效果可以做得更复杂。例如,太阳和视图矢量之间的点积的指数(当然它控制了方向颜色梯度的影响)也可以随距离变化。通过正确的设置,可以伪造发光/绽放和其他光散射效果,而无需实际执行任何多通道或渲染纹理,而是对雾方程进行简单更改。颜色也可以随着高度或您可能想到的任何其他参数而变化

【请注意,在太阳附近的背景山脉中,雾是如何将颜色染成黄色的】

【Final image (Elevated, 2009)】
该技术的另一个变体是将常用的 mix() 命令分为两部分,即替换
finalColor = mix( pixelColor, fogColor, exp(-distance*b) );
和
finalColor = pixelColor*(1.0-exp(-distance*b)) + fogColor*exp(-distance*b);
现在,根据经典的 CG 大气散射论文,第一项可以解释为由散射或“消光”引起的光的吸收,第二项可以解释为“内散射”。我们注意到这种表示雾的方法更强大,因为现在我们可以选择参数 b 的独立下降来表示消光和散射。此外,我们可以有不是一个或两个,而是多达六个不同的系数-三个为消光颜色的 rgb 通道和三个为散射的 rgb 颜色版本
vec3extColor=vec3(exp(-distance*be.x),exp(-distance*be.y)exp(-istance*be.z) );
vec3insColor=vec3( exp(-distance*bi.x), exp(-distance*bi.y) exp(-distance*bi.z) );
finalColor = pixelColor*(1.0-extColor) + fogColor*insColor;
这种做雾的方式,结合太阳方向的着色和其他技巧,可以给你一个非常强大和简单的雾系统,但非常紧凑和快速。它也很直观,你不必处理Mie和Rayleight光谱常数之类的大量物理、数学和魔术常数。简单可控就是胜利
【https://iquilezles.org/articles/fog/】
高度雾基于时段的变化
①日出日落
高度雾的形成通常与日出和日落时间有关。在日出前后和日落前后,由于气温的变化和空气湿度的增加,大气中的水汽更容易凝结成云雾。这是因为夜间地表的辐射冷却使得地表温度下降,空气接触到冷却的地表后容易达到饱和状态,从而形成雾
②季节性
另外,高度雾的形成也受到季节的影响。在冬季,由于气温较低,空气中的水汽更容易凝结成云雾,导致高度雾出现的可能性较大。而在夏季,气温升高,相对湿度降低,高度雾的形成相对较少
总结:一般在日出前和日落后形成,日出后随温度升高逐渐消散
&:在虚幻引擎中可以通过密度控制
高度雾基于海拔的变化
①海拔高度
高度雾的形成与海拔高度密切相关。随着海拔的增加,大气的压力和温度通常会下降,这对高度雾的形成产生影响,在较低海拔地区,空气通常比较潮湿,当空气中的湿度达到饱和点时,水汽会凝结成雾。因此,相对湿度较高的低海拔地区,高度雾的出现可能较为常见。
然而,随着海拔的升高,气温降低,空气中的相对湿度也会下降。这意味着在高海拔地区,形成高度雾所需的湿度条件更加苛刻。通常情况下,高海拔地区的空气更加干燥,高度雾的出现频率相对较低
另外,地理环境的因素也对高度雾的形成有影响。例如,在山脉或山谷等地形复杂的地区,空气可能会受地形影响而上升或下降,从而导致湿空气在较高海拔处凝结成雾。
需要注意的是,高度雾的形成不仅仅取决于海拔高度,还受到其他气象条件的影响,如气温、湿度、风向等。因此,在特定地区的特定海拔上是否出现高度雾还需要综合考虑多种因素。
②地理位置
此外,地理位置和地形也会影响高度雾的形成和变化。在山区或海洋附近的地区,由于地形的影响,湿空气更容易升至较高的海拔或山脉上,遇冷凝结成雾。这种情况下,高度雾可能更为常见
总结:低海拔、湿度大容易形成雾
可以通过:雾高度衰减来模拟该变化
#【UE5中的雾】
指数高度雾 在地图上较低位置处密度较大,而在较高位置处密度较小。其过渡十分平滑,随着海拔升高,也不会出现明显切换。指数高度雾提供两个雾色,一个用于面朝主定向光源(如不存在,则为直上光源)的半球体,另一个用于相反方向的半球体。
指数高度雾Actor的位置将决定雾的高度。使用 雾高度衰减(Fog Height Falloff) 进一步调整高度

性能
指数高度雾的渲染开销与额外优化的两层固定密度高度雾相近;雾 开始距离 。开始距离用于在查看器前方人为保留无雾的定义区域。用于Z缓冲会剔除像素,因此该距离有助于维持性能

体积雾
体积雾(Volumetric Fog) 是指数高度雾组件的一个可选部分。体积雾(Volumetric Fog)将计算摄像机视锥体中每个点的参与介质密度和照明,以支持不同的密度和影响雾的任意数量光源
在指数高度雾【细节】面板的体积雾类别下启用体积雾,可对其进行控制

◆体积雾的GPU开销主要通过体积纹理分辨率控制,可在引擎可延展性的阴影级别中设置它。设置为 高(High) 时,体积雾在PlayStation 4上需要花费1毫秒, 设置为 Epic 时在NVIDIA 970 GTX上需要花费3毫秒(因为需要运算的体素量是八倍之多)
01-使用体积(Volume) 域的粒子会导致GPU开销显著增高,具体取决于它们的3D过度绘制和指令数。使用控制台命令 profilegpu 可查看此开销
02-启用了投射体积阴影(Cast Volumetric Shadow) 的点光源和聚光源的开销约为不投射阴影的点光源和聚光源的开销的三倍
体积雾目前不支持开始距离(Start Distance) 、 雾最大不透明度(Fog Max Opacity) 和雾截止距离(Fog Cutoff Distance) 。一般而言,它无法匹配指数高度雾,因为它具有非物理行为


官方文档:指数高度雾、体积雾
https://docs.unrealengine.com/5.2/zh-CN/exponential-height-fog-in-unreal-engine/
https://docs.unrealengine.com/5.2/zh-CN/volumetric-fog-in-unreal-engine/
(案例学习工程文件)【后台私信:UE5雾】