天空大气

天空大气系统用于创建基于物理的天空和大气渲染,提供一天时间功能以及具有空气透视的地面到太空视图过渡。

Windows
MacOS
Linux

虚幻引擎4 (UE4)中的 天空大气 组件是一种基于物理的天空和大气渲染技术。它相当灵活,可以创造类似地球的大气层,同时提供包括日出和日落的一天时间,还可以创造奇特的外星大气层。它还提供空气透视,从中可利用相关行星曲率来模拟从地面到天空再到外太空的过渡。

SkyAtmosphereDayDusk.png

天空大气提供一种光经过行星大气层中的参与介质发生的散射的近似散射,因而为户外关卡提供更逼真或更奇特的外观,包括以下内容:

  • 可有两个大气定向光源接收日轮在大气中的表现,其中天空颜色取决于太阳光和大气属性。

  • 天空颜色将随着太阳高度而变化,即随主要定向光源的矢量与地面平行程度而变化。

  • 控制散射和模糊设置,从而完全控制大气密度。

  • 从地面到天空再到太空过渡时,空气透视可模拟场景的曲率。

启用天空大气组件

利用关卡编辑器中的 模式(Modes)面板执行以下步骤以启用天空大气组件:

  1. 在场景中放置 天空大气 组件。

  2. 在场景中放置 定向光源,然后从其 详细信息(Details) 面板启用 大气/雾太阳光(Atmosphere/Fog Sun Light)

    1. 若使用多个 定向光源,则为每个定向光源设置 大气太阳光照指数(Atmosphere Sun Light Index);例如,0表示太阳,1代表月亮。

  3. 在场景中放置 天空光照 以采集天空大气并让它为场景光照做贡献。

调整大气定向光源

定向光源 上启用 大气/雾太阳光(Atmosphere/Fog Sun Light) 并为每个定向光源设置 大气太阳光照指数(Atmosphere Sun Light Index) 后,可利用以下快捷方式快速调整每个定向光源的位置:

  • 使用 Ctrl + L 并移动鼠标将调整已设为指数0的定向光源。它通常是太阳。

  • 使用 Ctrl + L + Shift 并移动鼠标将调整已设为指数1的定向光源。它通常是月亮。

根据天空大气组件中为各个定向光源设置的属性,移动这些光源将影响大气。

天空大气模型

在UE4中模拟天空和大气,需要几个属性来模拟真实大气的外观和感觉。通过准确恰当地散射光,这些属性可用于定义天空和大气的外观。UE4中的天空大气组件默认表示地球。

对于类地行星,大气由多个气体层组成。它们本身由粒子和分子组成,而粒子和分子又有各自的形状、大小和密度。光子(或光能)在进入大气与大气中的粒子和分子碰撞时,或被散射(反射),或被吸收(见下文)。

ParticleLightInteraction.png

(1) 来自太阳的入射光;(2) 大气中的粒子; (3) 重定向的光能。

天空大气系统利用Mie散射和Rayleigh散射模拟吸收。这些散射效应通过模拟入射光与大气中的粒子和分子相互作用,让天空在一天时间过渡中适当地改变颜色。

使用天空大气组件时,天空颜色将根据一天时间模拟的变化而变化。

Rayleigh散射

光与更小粒子(例如空气分子)的相互作用产生了 Rayleigh散射。这种类型的散射主要依赖于光波长。例如,在地球的天空中,蓝色比其他颜色散射得更多,因此白天天空呈现蓝色。但在日落时,由于光线需要在大气中传播得更远,因此天空呈现红色。经过长距离传播,所有蓝色光都比其他颜色先散射开来,因而导致日落时天空中充满黄色、橙色、红色,五彩缤纷。

RayleighParticleShape.png

(1) 入射光;(2) 大气中的小粒子;(3) Rayleigh散射的光能。

在类地大气中,当太阳光与大气(2)中的小粒子(1)相互作用时,将在整个大气中发生Rayleigh散射。与地表(3)附近的下层大气相比,上层大气的密度更低。

RaylightAtmosphereInteraction.png

增大或减小大气中粒子的密度会使光散射增加或减少。

拖动滑块可查看Rayleigh散射比例(Rayleigh Scattering Scale)减小或增大后的效果。(从左到右,1-3)

  1. 减小 散射会导致光经过大气时散射减少。它的密度比地球大气的密度小10倍。

  2. 它代表类地大气密度。

  3. 增大 散射会导致光经过大气时散射更多。它的密度比地球大气的密度大10倍。

Mie散射

光与大气中悬浮的灰尘、花粉、空气污染物等更大粒子的相互作用会产生 Mie散射。这些粒子称为悬浮微粒,可能是自然产生的,也可能是人为活动造成的。符合Mie散射理论的入射光通常会吸收光,从而导致天空的清晰度因遮光而变得模糊。光通常也会更加向前散射,从而在光源周围产生明亮的光晕,例如空中日轮周围的光晕。

MieParticleShape.png

(1) 入射光;(2) 大气中的大粒子;(3) Mie散射的光能。

增大或减小悬浮微粒密度会导致天空清晰度提高或降低,因而影响天空的模糊程度。

拖动滑块可查看Mie散射比例(Mie Scattering Scale)减小或增大后的效果。(从左到右,1-3)

  1. 粒子密度 降低 会导致天空看起来更清晰。天空雾霾减少,光定向散射减少。

  2. 默认Mie散射比例。

  3. 粒子密度 增大 会导致天空变得闭塞。还会使天空显得模糊,同时入射光方向周围将产生强烈的前向散射光晕。

Mie相位

与大气中较大的悬浮微粒粒子相互作用时,Mie相位 控制光散射的均匀程度。通过Mie散射,光通常会更加向前散射,从而在光源周围产生明亮的光晕,例如空中日轮周围的光晕。

MiePhaseFunctionShape.png

(1) 入射光;(2) 大气中的大粒子;(3) Mie散射的更强光能。

使用 Mie各向异性(Mie Anisotropy) 属性控制大气中发生Mie散射的均匀程度。

拖动滑块可查看Mie各向异性(Mie Anisotropy)减小或增大后的效果。(从左到右,1-3)

  1. 减小 Mie各向异性(Mie Anisotropy)会导致在大气中更均匀地散射光。本例使用值0。

  2. 默认设置模拟类地大气。本例使用值0.8。

  3. 增大 Mie各向异性(Mie Anisotropy)会导致光散射更加定向,从而导致光在光源周围更强烈。本例使用值0.9。

大气吸收

利用 吸收比例(Absorption Scale)吸收(Absorption) 取色器属性控制吸收量和吸收颜色。以下示例展示了通过增大吸收比例(Absorption Scale)消除单一RGB颜色。

拖动滑块可查看大气的吸收比例(Absorption Scale)减小或增大后的效果。(从左到右,1-3)

  1. 大气吸收。

  2. 默认地球臭氧吸收比例。

  3. 增大 臭氧吸收比例。

利用 吸收比例(Absorption Scale)吸收(Absorption) 取色器属性控制吸收量和吸收颜色。以下示例展示了通过增大大气吸收消除单一RGB颜色。

Absorption_GreenRemoved.png

Absorption_RedRemoved.png

Absorption_BlueRemoved.png

吸收绿色

吸收红色

吸收蓝色

由于光线经过大气的散射方式,在一天中的不同时间,某些颜色的吸收可能不是很明显。

高度分布

利用天空大气组件,不仅可从地面视角控制大气,还可从空中和太空视角控制大气。这意味着可以有效地定义场景的曲率,以便从地面到天空再到太空的过渡看起来像真实的大气。

使用以下属性来实现这一点:

  • 使用 地面半径(Ground Radius) 定义星球的大小。

  • 使用 大气高度(Atmosphere Height) 定义大气的高度,高于此高度,我们将停止计算光与大气的相互作用。

  • 使用 Rayleigh指数分布(Rayleigh Exponential Distribution) 定义Rayleigh散射效应因密度降低而降低到40%时所处的高度,单位为千米。

  • 使用 Mie指数分布(Mie Exponential Distribution) 定义Mie散射效应因密度降低而降低到40%时所处的高度,单位为千米。

拖动滑块可查看大气Rayleigh高度降低和提高后的效果。(从左到右,1-3)

  1. Rayleigh大气高度为 0.8 千米。

  2. 默认的Rayleigh大气高度为 8 千米。

  3. Rayleigh大气高度为 80 千米。

星球视图

从外太空(或者直接从更高高度)定义行星视图时,可使用如下设置定义外观。

地球半径(Earth Radius):6360 千米

地球半径(Earth Radius):300 千米

星球半径(Planet Radius):300 千米

星球半径(Planet Radius):300 千米

星球半径(Planet Radius):300 千米

大气高度(Atmosphere Height):100 千米

大气高度(Atmosphere Height):100 千米

大气高度(Atmosphere Height):100 千米

大气高度(Atmosphere Height):100 千米

大气高度(Atmosphere Height):300 千米

Rayleigh大气高度(Rayleigh Atmosphere Height):8 千米

Rayleigh大气高度(Rayleigh Atmosphere Height):8 千米

Rayleigh大气高度(Rayleigh Atmosphere Height):2 千米

Rayleigh大气高度(Rayleigh Atmosphere Height):32 千米

Rayleigh大气高度(Rayleigh Atmosphere Height):32 千米

单击图像以查看大图。

艺术方向

想要为项目定义特定外观时,除基于物理的属性外,天空大气组件还支持艺术控制。

空气透视比例

空气透视距离比例(Aerial Perspective Distance Scale) 属性调整从视图到表面的距离,以便从空中视角查看时显得更厚重。

拖动滑块可更改空气透视视图距离比例(Aerial Perspective View Distance Scale)属性。(从左到右,1-3)

  1. 此场景的一些大气属性设置。

  2. 同一场景,但空气透视视图距离比例(Aerial Perspective View Distance Scale)略有增大。

  3. 同一场景,但空气透视视图距离比例(Aerial Perspective View Distance Scale)增大一倍。

指数级高度雾

Mie散射是大气的组成部分,它本身就是高度雾模拟,这意味着,无需使用指数级高度雾组件即可在场景中创建高度雾(见下文)。

ExpoHeightFog.png

高度雾是从天空大气组件生成的,无需指数级高度雾组件。

但若项目需要,可从项目设置(Project Settings)中的 支持影响高度雾的天空大气(Support Sky Atmosphere Affecting Height Fog) 设置启用。此贡献将叠加在高度雾本身现有的假颜色之上。利用天空大气组件上的 高度雾贡献(Height Fog Contribution) 属性,可控制天空和sin对高度雾的影响程度。

拖动滑块可看到高度雾对天空大气组件的贡献的增大和减小。(从左到右,1-3)

  1. 来自天空大气组件的默认高度雾贡献。

  2. 来自天空大气组件的一半高度雾贡献(0.5)。

  3. 来自天空大气组件的双倍高度雾贡献(2.0)。

天空渲染选项

天空和空气透视在屏幕上使用光线行进渲染。但若对每个像素都这样做,开销会很大,尤其现在的标准趋势是采用4K或8K的分辨率。所以才在几个查找表(LUT)中均以低分辨率计算天空。这些LUT是:

默认情况下将计算所有这些LUT,但通过以下示例,可确定自己项目的需求。

使用LUT类型

描述

FastSkyViewLUT

存储围绕视角行进天空亮度的光线的经度/纬度纹理。它仅适用于天空像素。

AerialPerspectiveLUT

将透射率和散射亮度存储到froxel(摄像机视锥体素)中。用于在不透明和透明网格体上应用 空气透视

MultipleScatteringLUT

在光线行进过程中,用于计算多个散射贡献。

TransmittanceLUT

在光线行进过程中,用于计算太阳光在大气中和行星上任意位置的剩余照度。

DistanceSkyLightLUT

用统一的相位函数存储散射事件后的非遮挡亮度。

利用上述许多设置,可控制项目的LUT性能和视觉质量。欲了解更多详情,参见天空大气参考 页面。

使用Skydome网格体渲染天空

在某些项目中,需要在场景周围放置skydome网格体,以便美术师控制如何用云星星、太阳和任何其他天体组建天空。

要设置skydome网格与天空大气组件一起使用,需要在材质中执行以下操作:

  • 在材质详细信息( Material Details)面板中的材质(Material)类别下启用 为天空(Is Sky)

  • 将混合模式(Blend Mode)设为 不透明(Opaque)

  • 将着色模型(Shading Model)设为 无光照(Unlit)

天空 材质在基础通道中渲染为最后一个不透明网格体,这意味着不会对其应用空气透视,以避免双重作用。但若使用了高度雾和体积雾,将继续应用。

在此材质中,可自由地构建天空、日轮、云和空气透视。还需计算天空中云和其他元素的光照。

可使用多个材质表达式在项目中实现这一点。在材质编辑器中搜索"天空大气"时可找到。

欲了解这些材质表达式的更多信息,参见天空大气参考 页面。

使用其中一些表达式时,由于它们将推动skydome网格体形状的值的计算,此网格体形状非常重要。例如,若用这些函数计算云上的光照,可假定skydome像素场景位置表示云在大气中的场景位置。

一天时间关卡示例

UE4提供了可行的模板图示例,展示了材质中使用天空大气材质表达式的skydome网格体。

SkyAtmos_TimeOfDayMap.png

可在Engine Content文件夹中的 Engine/Maps/Templates 下找到此关卡,也可使用主菜单来创建新关卡并选择TimeOfDay_Default Level。

可视化和调试

借助天空大气的可视化和调试视图,可实时查看对大气设置所做的更改。

SkyAtmosVisualization.png

  1. 半球视图 显示大气的可视化表示,同时考虑Rayleigh和Mie散射以及吸收。

  2. 一天时间预览(Time-of-Day Preview) 根据天空大气组件所应用的设置显示一天内的不同时间。

  3. 图表视图(Graph View) 显示在天空大气组件所设的地面高度和大气高度范围内的Rayleigh值、Mie值和吸收值的表示。

利用以下命令来支持在屏幕上绘制天空大气形象:

r.SkyAtmosphere.Visualize 1

其他信息

  • 设置基于物理的天空光照

    • 太阳位于最高点时,若角度直径为0.545度,应设为120000勒克斯(即cd:sr*m^2)。

    • 太阳垂直位于最高点时,白色漫反射表面的总亮度应设为150000勒克斯左右。

      • 天空贡献将占总贡献的20%。

      • 在引擎中用亮度/照度计测量此值时,应禁用环境遮挡,可在HDR(眼部适应)可视化工具(显示(Show)> 可视化(Visualize))中找到此工具。

      • 天空大气组件中的 多散射(Multiscattering) 应等于1,地球反射率(Earth Albedo)默认为0.4(线性)。

    • 月亮位于最高点时,若角度直径为0.568度,应设为0.26勒克斯。

  • 为什么地面/下半球看起来很暗? 接近地面时,没有任何雾,因此没有散射效应,也没有任何雾颜色。这意味着,虚拟星球的下半球是黑色的。要解决这一问题,请尝试以下方法:

    • 填充场景时用地形或网格体表示行星表面。

    • 用指数级高度雾组件作为下半球颜色填充。

    • 将地形或网格体表面置于较高的高度。

  • 为什么次要定向光源对天空的影响较小? 目前未为次要光源计算多散射。

  • 为什么skydome上可看到纹素? 若天空上出现了纹素,尝试增大FastSkyViewLUT (r.SkyAtmosphere.FastSkyViewLUT.SampleCountMax)的分辨率。若雾化元素上出现了纹素,增大AerialPerspectiveCameraVolumeLUT (r.SkyAtmosphere.AerialPerspectiveLUT.DepthResolution)的分辨率。

  • 当摄像机未接近星球的+Z北极时,大气光发挥作用吗? 作为优化,仅计算表面光照上的太阳光投射效应,就好像摄像机位于行星顶部(超过+Z位置)一样。在未来的版本中将根据反馈对此进行改进。

  • 能否在屏幕上一次性渲染多个行星大气? 该版本的天空大气系统目前不支持此功能。

  • 出现噪点、失真和一些不同颜色的圆环 当高频元素或数值在接近地面的大气中产生难以发觉的高峰值时,用以下两种方法之一来解决此问题:

    • 使用 r.SkyAtmosphere.SampleCountMax 增大天空大气样本计数。

    • 若要使用FastSky LUT而非逐像素光线行进,使用 r.SkyAtmosphere.FastSkyLUT.SampleCountMax。 欲了解更多详情,参见本页的天空渲染选项 部分。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback