ZunGarden水和相关材质分析

整体概况

我们对这个模块的主要研究的内容有:

  1. 静态水面其反射是如何实现的

  2. 静态水面其流动效果和波纹感是如何实现的

  3. 静态水面如何实现的鼠标点击下的波纹荡漾。

  4. 静态水面浮光掠影,主要控制透明度,最后并没有使用

  5. 静态水面如何实现的折射效果

6 . 动态水面的制作

  1. 鱼的材质制作

1.1水面相关所有组件

我们找到水面材质的actor后我们会看到它里面的组件:

  1. Billboard: BillboardComponent 是一个会被渲染为始终朝向摄像机的 2D 贴图,

  2. StaticMesh:一个巨大的有厚度的平板

  3. Sphere:

  4. :ParticleSystem

1.2水面相关成员变量

这里比较值得先说的就是Billboard,设置Billboard的大小,大小主要和Actor大小一致。

静态水面反射机制

其反射使用的方法是基于IBL的反射原理。其为了性能上的优化,做了基于顶点的计算。所以,其还是使用了自定义UV的技术来在顶点着色器中进行计算

材质会暴露一个LocationandRadius的参数,这个参数的前三个值代表的是其世界空间中的坐标,最后一个值代表的是半径

所有的参数如下

当创建材质时

在蓝图动态创建这个材质

之后对这个参数进行修改。

其中ReflectionOffset的值是:

首先将该actor在空间中对应的反射球的位置ReflectionActor的位置变换到自身的局部空间当中。然后用这个值来设置Reflection Offset的值。也就是说我们最后对应cubemap的坐标位置是和反射球的位置保持一致的。

之后实际上还有一个操作就是设置Sphere的半径和在世界空间的位置,这个位置主要是用ReflectionActor的位置,也就是说他们两个的世界空间位置是在一块的。

现在我们回到我们的材质当中。

这里最重要的节点就是上图,根据相机位置反射位置和顶点位置,进行顶点级别的操作,这件事情当然是可以在像素着色器中做,但是会更消耗性能。这时我们计算出坐标后,有三个值,我们把之XY存储到第customizedUV1中,然后把Z存在customizedUV2 的u中,然后它的V是存储的它的菲尼尔系数

最后在我们的自发光的模块,进行对应的取值就可以了

当然最后会有菲尼尔的系数叠加

静态水面皱纹与流动

其流动的效果,还是通过自定义Uv,增加一个平移来实现

那么它的皱纹是如何实现的呢,主要是通过Normal贴图来实现的

最后的法线贴图和cubemap里的反射位置进行叠加,呈现波纹的效果

静态水面水面波纹互动

这个效果就是能够在鼠标点击的时候制作一个围绕水面的波纹

主要的做法是传给材质一个Shpere的坐标,然后根据权重,进行从内到外的波纹加权

从而实现这样的基本功能

静态水面浮光掠影

这里在测试的时候好像没看出有什么用,这里其实就是控制其透明度的问题

总之在最终的材质中没有用到,官方的吐槽是保罗的大便???

静态水面水底的折射效果

其利用水底的蠕动,进行折射效果的模拟,我们来看具体的材质

首先是看到是只有CUV2是使用的

最主要的就是世界空间偏移,其使用的VertexDistortion进行顶点扭曲,具体的含义就不介绍了。这里的

具体的效果就是两个材质的叠加,然后和我们的CUV2影响,来增加层次感

动态水面的制作

首先我们要知道的是,动态水面这里特指是只水缸里的水制作。它的技巧主要是对场景偏移上的操作上面,剩下所有的都和那些是一样的

其在编辑器中对顶点颜色进行编辑,然后在及逆行一个Jiggle_WPO的偏移操作,

这样就会呈现一个水的溢出效果呈现呼吸感

八. 鱼的材质制作

其主要技术点还是世界场景偏移,让其能进行摆动

最主要的就是顶点颜色的绘制

有非常多的参数进行控制,之后

通过不同的RGB的颜色来判断是头还是尾,这样来进行摆动