【UE技术案例】场景交互雪
一. “画笔”与“画板”
1.1 RT的使用
- Render Target 可以当Texture使用,相当于一张画布,通过蓝图节点或函数在上面绘制图案
- Render Target 的两种使用方式:
- 直接使用 Draw Material to Render Target,直接绘制材质
- Begin Draw Canvas to Render Target 与 End Draw Canvas to Render Target 的配合使用,适用于需要在RT上绘制多个元素的情况

- 常用的绘制节点
- Draw Material
- 需要特别注意的是:从世界坐标变换到画布的位置Screen Position,还需要减去尺寸Screen Size的一半
- Rotation 是绕 Pivot Point 旋转
![]()
- Draw Material
-
- UV
![]()
- UV
- Render Target 的一些细节
![]()
- 通过 RT,将虚幻场景类比为一块画板
- 1. 创建BP(Actor)画板蓝图、Material 材质、Render Target渲染目标(蓝图也可以动态创建RT,但通过蓝图动态创建过多RT,则容易出问题)
![]()
- 1. 创建BP(Actor)画板蓝图、Material 材质、Render Target渲染目标(蓝图也可以动态创建RT,但通过蓝图动态创建过多RT,则容易出问题)
-
- 2. 框定画板范围大小(2000*2000),材质为我们刚刚创建的RT(注意:RT_Snow 需要是 Linear Color 类型的)
![]()
- 2. 框定画板范围大小(2000*2000),材质为我们刚刚创建的RT(注意:RT_Snow 需要是 Linear Color 类型的)
-
- 优化一下
![]()
- 优化一下
1.2 映射范围位置




- 将世界位置映射成 RT 的 UV
- 1. 使用两个 Vector2D 定义画板的位置和尺寸
![]()
- 1. 使用两个 Vector2D 定义画板的位置和尺寸
-
2. 通过变量Position、Size,同步设置材质的两种方法
-
动态材质实例:在蓝图中创建动态材质实例 Create Dynamic Material Instance,拿到地面引用,并设置材质中的参数 Set Vector Parameter Value;但通过蓝图动态的设置地形比较复杂,不建议使用
-
材质参数集:相当于一个全局变量,更适合做全局的统一控制(如四季变换)
-
-
-
3. 创建材质函数、材质参数集
![]()
-
-
- 4. 材质参数集:将2个二维向量合并
![]()
- 4. 材质参数集:将2个二维向量合并
-
-
5. 材质函数中写位置映射的逻辑
-



-
-
6. 在材质中调用材质函数,位置映射
![]()
-
7. 在蓝图中计算绘制的位置
![]()
![]()
![]()
- 效果如下:
![]()
-
1.3 走向无限




- 1. 让画板始终跟随人物移动:
- 创建更新位置的函数(更新位置,更新材质参数集中的参数,设置 debug 的 plane 位置)
- 将 Position 设置为玩家位置,每帧更新
![]()

-
- 2. 将画板之前的图案随人物移动更新:
- 创建副本RT_SnowSave(由于,无法在绘制一张RT的同时对其进行采样,所以需要将 RT_Snow 绘制到 RT_SnowSave 上,再将 RT_SnowSave 平移后,绘制到当前 RT_Snow)
![]()
- 创建副本RT_SnowSave(由于,无法在绘制一张RT的同时对其进行采样,所以需要将 RT_Snow 绘制到 RT_SnowSave 上,再将 RT_SnowSave 平移后,绘制到当前 RT_Snow)
- 2. 将画板之前的图案随人物移动更新:
-
-
- 创建材质函数,采样上一帧的数据
![]()
- 创建材质函数,采样上一帧的数据
-
-
-
- 创建材质,借助材质函数中采样的上一帧数据,平移 RT_Snow(Texture Sample 采样 RT_SnowSave)
![]()
- 创建材质,借助材质函数中采样的上一帧数据,平移 RT_Snow(Texture Sample 采样 RT_SnowSave)
-
-
-
- 创建函数:拷贝RT_Snow
![]()
- 创建函数:拷贝RT_Snow
-
-
-
-
在 BP_Drawing 中写逻辑
![]()
-
-

-
- 3. 解决远处图案模糊的bug,和图案无限重复的bug
- 边缘消融
- 设置画板尺寸大小与材质大小一致:1024*1024
![]()
- 边缘消融
- 3. 解决远处图案模糊的bug,和图案无限重复的bug
-
-
- 对齐像素,防止插值
![]()
![]()
- 对齐像素,防止插值
-


二. 多种绘制方式
- 雪地画笔
- 1. 准备工作
- 整理:将绘制过程坍塌成一个函数,方便管理
- 整理:将设置材质平移参数的过程坍塌成一个函数,方便管理
![]()
![]()
- 创建雪地画笔 BluePrint(Scene Component,只有 Scene Component 才有位置信息)
- 创建蓝图结构体(存储画笔信息)
![]()
![]()
-
2. 画板BP_Drawing 与画笔BP_SnowBrush 间的通讯
-
在画板BP_Drawing,添加自定义事件,接收绘制信息
![]()
- 使画板BP_Drawing 永远在画笔BP_SnowBrush 之后完成(先画完再记录),画笔BP_SnowBrush 默认在物理前
![]()
- 将位置、绘制大小、雪地高度(射线检测 0-30 的雪地高度范围内)传递给 BP_Drawing 画板
-
创建材质
![]()
-
画板BP_Drawing
![]()
-
- 1. 准备工作
-
- 3. 将画笔BP_SnowBrush 组件附着在人物脚上
![]()
- 3. 将画笔BP_SnowBrush 组件附着在人物脚上

-
- 4. 优化一下
- 由于交互雪,只需要黑白两种颜色,可以将两张RT都改成R16f,每张可以省3个通道的带宽
![]()
![]()
-
调大一点范围,使雪在人视线远处消融,效果更逼真,同时需计算像素大小,以确保脚印始终为指定大小
![]()
![]()
![]()
- 由于交互雪,只需要黑白两种颜色,可以将两张RT都改成R16f,每张可以省3个通道的带宽
- 4. 优化一下
- 让雪堆积起来
- 创建堆积雪材质
![]()
- 调整两张RT的分辨率为:2048*2048(记得也要同步修改 BP_Drawing 中的变量 Resolution Ratio),注意分辨率建议为2的n次幂
![]()
- 调整雪材质
![]()
- 有请虚拟高度场网格体
- 添加插件 Virtual Heightfield Mesh 重启项目,并启用 Enable virtual texture support
![]()
- 由地形材质来给 “虚拟高度场”,
- 添加插件 Virtual Heightfield Mesh 重启项目,并启用 Enable virtual texture support
- 创建堆积雪材质
技术参考:
未完待续...













































浙公网安备 33010602011771号