Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析

Posted 清清!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析相关的知识,希望对你有一定的参考价值。

本系列学习资料来源,Ben Cloward的油管空间,B站的搬运翻译

Lec31 天空与雾气 Unreal Sky & Atmosphere

本节为场景增加雾气和大气
这是我们之前的场景,多少感觉整体有些平淡,主要是因为光照没调整过
作为一个巨大的户外场景,它缺少了场景的深度感以及大气的氛围感

当我们最开始选择TimeOfDayd的关卡模板时,它会默认给我们配置一些东西

也就是最后这五个,它们会被默认配置

我们其实可以自己手动添加一些诸如雾气,光束的效果

1 Directional Light & SkyAymosphere

首先我们来看这两者的关系
点击Directional Light,鼠标移到场景中,按住Ctrl+L,鼠标长按后松开,就会出现右下角这个小标志,随着鼠标移动可以自由移动Directional Light的方向

当把太阳在上面时,场景和云层是白的,当太阳拉到地平线的时候,场景就会变成黄色

这种模拟大气的效果由SkyAtmosphere中的瑞利散射参数和米氏散射参数来控制

尽管这些参数让大气在日出日落时变黄变红了,但是场景的深度感还是没有达到,其实也就是没有雾

2 Fog

于是接下来我们添加一下指数雾

把它一拖进来,就会发现效果有了,就是雾太多了

并且自带的雾气颜色会覆盖之前的散射效果,我们调整一下,让雾气颜色继承大气颜色,在project setting里找到这个,打钩,然后重启

因为雾气的参数会和原本的大气效果相加,所以在重启后把雾气颜色和方向都设置成黑色,这样我们的颜色就都是大气里拿来的颜色了

当拉到日出日落的时间时,雾气呈现黄色

如果打开体积云,很好看

3 Light Shaft

打开Directional Light里的Light Shafts选项,把LightShaftOcclusion和LightShaftBloom勾上

得到如下效果

LightShaftOcclusion的功能是,当某块区域挡住光线时,那块区域的雾就会变暗,得到暗暗的光束
LightShaftBloom的功能是,当光线很亮时,添加bloom

如果太阳会一闪一闪的,可以调低BloomScale和BloomMaxBrightness

Lec32 体积云设置 Volumetric Clouds

本节介绍六个关于体积云的外观和性能的参数设置

为了衡量性能,我们打开GPU cost

总毫秒数8.82,体积云是1.03

如果关掉体积云,可以看见场景渲染的毫秒数下降了,变成了7.21,并且下降的量比体积云本身的毫秒数多,这意味着体积云的一些成本也隐藏在其他指标中

所以我们在参数设置时,既要看体积云本身的消耗,也要看整体的消耗

1 Layer

首先是体积云组件的Layer参数

  • Layer Button Altitude设置为5km,Layer Height设置为10km
    这两个参数控制云层的开始和厚度
    比如现在就是从场景上方5km开始,云层走过10km
    关于这个是什么含义,我们需要了解一下云层构造(下图选自世界气象组织的网站

    动态调节一下这两个参数,效果很明显

    性能上来说,Layer Button Altitude影响不大,Layer Height控制云的厚度,性能消耗高一些
    比如设置成4和3的时候,消耗降低了一些,云层薄了一些

2 Multi-Scattering

打开云层材质

打开母材质

打开云层的材质,在下一节我们再看看这材质在干什么

找到Advanced Output的输出节点,可以看到Multi-Scattering的参数

光线打到云层表面,不是直接被一个硬表面反射,而是打到云层中的小液滴继续散射到内部
在实时渲染中,复杂的多重散射效果是通过对实际散射过程的近似模拟来实现的,具体来说,通过在体积材质中追踪透光率的多个倍频(或步骤)来实现
在UE4中,用Multi-Scattering的参数来近似光线散射
如果把它拉成2,消耗会变多
对于实时来说设成1就可以,对于一些高画质要求的可以设置成2

3 Ray Marching / Beer Shadow Maps

接下来看看云层如何在它们自己身上投射阴影
默认所用 光线步进(Ray Marching) 以及 Beer阴影贴图(Beer Shadow Maps) (BSM)。

可以在所用的云材质内切换两个模式,在Volumetric Advanced Material Output的细节面板的中的光线步进体积阴影(Ray March Volume Shadow)选项上勾选来进行切换

Ray Marching就是将射线投射到体积中,不断沿着射线采样看该位置是否有被云的结构遮挡,这个方法性能消耗高,但是质量好
Beer Shadow Maps就如图名字描述,使用shadermap,消耗较低
我们切换成Shdow Map的方式来看看(也就是去掉勾选)

首先是RayMarching的方式,如下图

然后是ShadowMap的方式,如下图,可以看到云的阴影很实,消耗降低了

4 Cast Cloud Shadow

接下来看看云层的投射阴影,打开方向光

中间那两个需要我们在云层上,并且有足够大的东西投影到云层上才有用,我们的场景里没啥用

第四个√可以看一看
打开时是这样

如果取消掉,没了阴影,云就变亮了,对整体性能影响不大,但是对效果影响很大

5 Cloud Ambient Occlusion

打开SkyLight的这个组件

把它取消掉会亮一点,它的作用是给云一个AO,对性能影响不大,可以开着

6 Transmittance

最后一个设置是体积云组件的这个参数,不开启代表全局都用一个Transmittance值,开启的话则是计算具体的Transmittance值

对整体云的质量是比较有影响的,性能上消耗不大

7 效果

各个参数根据需求调整,看看现在的场景效果

Lec33 体积云材质 Volumetric Cloud Materials

本节来解析默认的体积云材质

原本那个连线图太乱了,把它整理一下

从大局来看,我们先创建一个云的BaseShape,然后再创建一个云的NoiseShape,把这两部分通过Height来lerp到一起,然后由一些参数控制消光(extinction)和颜色

云层底部是形状平滑的BaseShape,云层顶部是比较嘈杂的NoiseShape,可以从场景中看到效果

一步步解析

1 BaseShape

先看根节点,体积渲染,叠加模式为additive

然后看材质最左边
世界坐标位置配合一个scale参数,为之后云层的采样提供坐标
时间配合方向参数,为云层运动提供参数

而后两者相加进入BaseShape,配合再乘以一个参数控制基础的噪声尺度,然后去采样我们的三维纹理

来看看这个三维的纹理是什么,是一个个分块,看着很像序列帧,或者flipbook里的纹理

但其实这些一块块的东西是一个三维纹理的切片,制作时可以用数学方法先生成噪声,然后在渲染出图的时候切片分割出图

换一种显示方式可以看到一个正方体的纹理,这是云材质的基础

而后进行一个指数调整,相当于增加对比度

我们来控制一下BaseNoiseScale和BaseNoiseExp这两个参数
调整一下Scale,随着这个值的变化,体积纹理就被tilling了不同的次数,找到重复感不严重又能有细节的值就好

调整指数的值,则是对于噪声纹理的对比度进行了调整,可以控制云层的颗粒度是厚实还是分的很细

这时候在BaseShape部分还有一个东西,就是这个Input,它提供了一个ConservativeDensity的参数

这个参数从哪里来呢,这就要看到该材质内的独立的一个部分

2 Volumetric Advanced Output

有上面那个Input,是因为我们在这里输出了一个Volumetric Advanced Output,这个输出节点是对于体积材质特定的,其最后一栏有一个ConservativeDensity
可以看到左边有一串节点计算了这个值

左边这串节点做了什么呢?它们定义了云的外形,然后输出给ConservativeDensity,再与BaseShape里的噪声纹理进行相乘,得到BaseShape
我们可以试试看只输出这个值

可以看到cloud只有基本形状,没有了噪声


我们来具体看看左边那一串节点做了什么

先看一部分拿到世界坐标位置,加上一个系数,只要XY,乘以一个系数控制比例(到这里很正常,像是一个投影而已),然后采样一个纹理

  • 这个纹理是什么?我们可以看一看用到的这俩通道是啥
    R通道,云层底部的形状

    G通道,从底层到高层的云的,值从黑到白

采样过后,再看后面的节点

  • 绿通道power一下,作为UV值的U(越靠近高层云的位置,U越大)
    1-CloudSampleAttributes作为UV值的V(CloudSampleAttributes这个值带来了云层的标准化高度,下0上1,然后1-来反转一下,下1上0)
    通过这个UV去采样一个图(上图左边显示的那个形状),也就是云的横截面图(U在横向移动,V在纵向移动)
    场景中把这个截面图采出来大概就是这样

    把这个结果和红通道相乘,就可以得到一个三维的有云的轮廓
    后面那个custom节点就是判断CloudSampleAttributes如果不在指定范围,就把输出归为0
  • 通过一个从上往下看的纹理和横截面纹理,就重建出了天上的“云空间”
    为什么要建立这个“云空间”呢?因为我们不可能真的渲染这个天空,ConservativeDensity的定义会让我们会在我们需要的地方去做计算,ConservativeDensity为0时,也就是云不存在,也就不需要计算体积了
    所以ConservativeDensity也就相当于是一个空间密度,定义了这个密度,可以节省不必要的计算

3 NoiseShape

在进入NoiseShape的那些节点之前,我们来看看BaseShape的输出是什么(把lerp的节点输出替换成BaseShape的结果)

从上到下,所有噪声的分布都是一样的

而在我们原始的云材质中(下图),效果是明显上面的云更加细碎

这就是NoiseShape的作用,打破tilling

在节点中,我们在采样的第二个三维噪声(一个分辨率比较低的三维噪声),其用的time是乘了-0.1,和BaseShape的运动相反,其Scale也比BaseShape来的大,Exp和Strength来控制这个高频噪声的强度(如下方动图)


然后传入BaseShape的值,进行Remap

4 lerp

根据BaseShape,NoiseShape,以及高度的值(也可以根据参数调整),进行插值,插值结果乘以颜色和Extinction

5 拓展

可以去plugins里找到volumetric插件,里面有很多样例和贴图
以及在Ben佬这个视频下面,有人推荐了这个自制体积云的视频,也可以学习学习

暂时放着之后来补,期末了,开冲!

以上是关于Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析的主要内容,如果未能解决你的问题,请参考以下文章

Building Worlds In Unreal 学习笔记——29-30 水坑与涟漪

Building Worlds In Unreal 学习笔记——01-02 概览与引入

Building Worlds In Unreal 学习笔记——12-14 瀑布/雾与光/总结与展望

Building Worlds In Unreal 学习笔记——03-06 地形贴图/地形材质/修正重复/近景位移

Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析

Building Worlds In Unreal 学习笔记——31-33 天空与雾气/体积云参数与材质分析