简介
这是一个用 RenderTarget 模拟水波效果的简单示例,波纹高度模拟和波纹法线计算设计的很巧妙
官方说明只讲了建立工程的步骤及相关 Blueprint 中的设定,但没有解释其中的原理,此文根据我自己的理解加以说明
RenderTarget
RenderTarget 其实就是一般 3D 渲染概念中的显卡模板缓冲区,可以缓存渲染数据,而 UE4 将其进行了封装,让我们可以方便地用 Blueprint 进行操作,比如绘图
此示例使用了 4 个 RenderTarget,其中 3 个循环使用,以模拟计算波纹高度,另一个用于计算波纹法线
参数值由来
-
0.003906
此值在高度模拟和法线计算时都有使用,这个值不是随便来的
此例中使用的 RenderTarget 尺寸都是 512*512,而纹理空间 UV 的取值范围是 [0, 1],所以每一个像素的大小为 0.001953
此值即是两个像素的大小
-
0.02
基于上面的计算,此值约等于 10 个像素的大小
初始施加力
这部分是相对最简单的,就是把鼠标位置映射到纹理空间中的一个点,然后针对每一个像素,根据到此点的距离,线性换算成一个高度值,存入纹理的 R 通道
简单点说就是:
//0.02 - distance 还被约束到范围 [0,1]
h = (0.02 - distance) / 0.02
波纹高度模拟计算
此部分相对是最难的,使用了三个 RenderTarget,对应前一帧、当前帧、下一帧,循环进行模拟
每一帧对每一个像素,使用当前帧的高度图,采样其前后左右四个点,计算出均值并取一半作为此像素的变化趋势
然后减去再前一帧的高度,作为下一帧的高度值,存入纹理的 R 通道
-
问题1
按照这种模拟计算,由于开始的时候没有再前一帧的数据,导致一开始的几帧,纹理中心部分的高度其实是继续上升的,但很快会降下来,可以通过下面心得部分的方法进行验证
-
问题2
此处结合两帧的数据,用当前帧计算均势,再应用到前一帧作为下一帧的高度,这个设计很巧妙
大家可以尝试改成只用当前高度加上趋势进行计算,可以看出其中差异
波纹法线计算
此部分看起来挺难的,道理说透了,其实也简单
跟高度计算类似,对当前帧高度数据的每一个像素,采样其前后左右四个点,前减后,左减右,得到两个十字相交的向量
然后计算向量叉乘,得到的向量作为此点的法线方向
心得
可以通过修改 WaterSurface_BP 中的 UpdateRate 参数,比如改成 5,以较慢的速度看每一帧流体表面的变化
网友评论