我在场景中发现了一个环境控制器,这个场景实现了雨天天气和晴天风沙天气,接下来我分析一下这个天气控制器是如何实现。
实现流程:

  1. 将环境控制器拖入场景,在配置项上面设置相应的雾,主光源,天空光。
  2. 在环境控制器中去设置场景上面的相关配置。
  3. 在环境控制器中去修改材质上的配置项
    接下来,我们看一下案例场景中的实现过程。

环境控制器蓝图实现

首先看一下环境控制器的配置项,

Wetness Level 则是湿度 会控制场景内材质的光滑度

Raindrops Amount 则会显示雨滴落到地面上的效果密度

Allow Particles 是否更新粒子

Is Raining 是否是雨天

关卡列表上面可以根据下来选择场景中的 雾 主光源 天空光

Unreal 5 实现场景环境控制组件_游戏


在构造函数中,设置材质函数库地面湿度和雨滴的密度的配置

Unreal 5 实现场景环境控制组件_贴图_02


然后根据设置是否雨天配置,设置分支

Unreal 5 实现场景环境控制组件_人工智能_03


雨天中,修改雾的配置

Unreal 5 实现场景环境控制组件_贴图_04


修改直接光的配置

Unreal 5 实现场景环境控制组件_人工智能_05


修改天空光的配置

Unreal 5 实现场景环境控制组件_游戏引擎_06


晴天中,修改雾的配置

Unreal 5 实现场景环境控制组件_游戏_07


修改直接光的配置

Unreal 5 实现场景环境控制组件_unreal engine 5_08


修改天空光的配置

Unreal 5 实现场景环境控制组件_unreal engine 5_09


在事件图表中,事件开始运行时,根据是否雨天,设置材质参数集的值,当前为雨天的设置,并调用雨天特效

Unreal 5 实现场景环境控制组件_游戏_10


如果是晴天,使用设置的湿度和密度设置,并调用移动风沙效果。

Unreal 5 实现场景环境控制组件_贴图_11


定义了两个自定义事件,这两个事件是给房屋提供的事件调用,在上一篇讲过,房屋蓝图里面碰撞体和玩家产生碰撞以后,就会触发Inside事件,而完成碰撞以后,就会触发Out事件。如果Allow Particles的值为true,才会更新粒子特效,并且根据是否雨天,调用雨天事件或者风沙天气事件。

Unreal 5 实现场景环境控制组件_游戏引擎_12


雨天事件,会根据是否在建筑内,选择添加或者删除特效,如果选择添加,会在玩家控制的摄像机上面添加一个粒子系统

Unreal 5 实现场景环境控制组件_游戏_13


风沙特效也是同样的道理

Unreal 5 实现场景环境控制组件_游戏_14


它们最后都调用了建筑内的特效,这个只会在屋内显示的效果

Unreal 5 实现场景环境控制组件_游戏_15

设置材质的参数

修改场景内的材质的相关参数来表现晴天和雨天的不同效果,这里环境控制器是通过设置标量参数值实现的,主要是设置一个浮点数,其实还有一个就是设置向量参数值,这个需要传入一个四维向量去设置。那么,接下来讲解一下如何在材质中实现当前值的使用,并分析一下场景内的材质如何实现雨天材质和晴天材质的变化。

Unreal 5 实现场景环境控制组件_人工智能_16


如果能够设置到材质里面,需要创建材质参数集

Unreal 5 实现场景环境控制组件_unreal engine 5_17


材质参数集里面可以设置标量和向量,标量就是单个浮点,向量就是四维向量,

Unreal 5 实现场景环境控制组件_贴图_18


这个文件可以直接拖入到材质或者材质函数中使用,运行时,修改了当前的值,材质相应的值也会被修改。

Unreal 5 实现场景环境控制组件_贴图_19


拖入后,选择节点,可以选择参数集中使用的参数

Unreal 5 实现场景环境控制组件_unreal engine 5_20

场景里地面材质的实现

我们可以看一下场景里面的Road的材质怎么实现的,里面使用了两套纹理实现的,纹理也是标准的pbr物理光照材质实现的纹理设置,一张反射率贴图,一张法向贴图,还有一张Mask贴图

Unreal 5 实现场景环境控制组件_游戏引擎_21


这一块是实现的视差遮挡偏移,视差遮挡偏移的原理是根据相机朝向和物体高度图来偏移uv实现。后面就是宏去开启或者关闭,并且还可以根据清晰度设置来开启和关闭。

Unreal 5 实现场景环境控制组件_人工智能_22


然后使用uv去拾取反射率贴图

Unreal 5 实现场景环境控制组件_贴图_23


然后采样Mask贴图,R通道是高度,G通道是粗糙度,B通道是环境遮挡,因为路面不是金属,所以直接设置金属度为0即可。

Unreal 5 实现场景环境控制组件_贴图_24


还有采样了法向贴图

Unreal 5 实现场景环境控制组件_游戏引擎_25


然后创建了材质属性节点,这个节点主要就是保存设置的信息,也方便lerp插值以及选择。

Unreal 5 实现场景环境控制组件_贴图_26


这个材质使用了两套贴图,所以需要一个mask去获取当前到底使用哪个属性

Unreal 5 实现场景环境控制组件_人工智能_27


两套属性的混合使用是在世界坐标系下面的混合,通过位置进行三平面映射,获取到纹理的G通道,

Unreal 5 实现场景环境控制组件_人工智能_28


G通道的效果是这样,然后还将强度乘以2,让第一个通道的属性显示区域大一些,估计是trick。

Unreal 5 实现场景环境控制组件_游戏引擎_29


然后使用混合材质属性节点,使用mask去混合,如果不开启宏,则直接使用第一套材质属性。

Unreal 5 实现场景环境控制组件_unreal engine 5_30


然后使用了环境光遮挡处的苔藓效果,然后使用烘焙的ao去作为mask混合苔藓和基础默认的材质属性

Unreal 5 实现场景环境控制组件_人工智能_31


然后创建了水的材质属性

Unreal 5 实现场景环境控制组件_人工智能_32


水的函数里面就是生成了一套材质属性,水的反射率贴图,法向贴图和粗糙度,还有根据高度,根据高度生成了Mask

Unreal 5 实现场景环境控制组件_游戏_33


然后就是最后根据水的mask混合材质属性

Unreal 5 实现场景环境控制组件_贴图_34


属性通过雨滴效果函数设置,然后生成最终显示在材质。

Unreal 5 实现场景环境控制组件_人工智能_35


在雨滴特效函数里面,修改了基础颜色,粗糙度和金属度

Unreal 5 实现场景环境控制组件_人工智能_36


还有修改法向

Unreal 5 实现场景环境控制组件_游戏_37


里面重点的部分就是FlipBook,然后使用一张序列帧图片,来循环实现雨滴效果。

Unreal 5 实现场景环境控制组件_游戏_38