Shader实现瓶内液体效果

话不多说,先上图…
在这里插入图片描述

完整原码地址:

https://blog.csdn.net/ww1351646544/article/details/104917031

需求:

1.液体效果可变色。
2.液体透明有折射效果。
3.适应各种容器形状。
4.随移动幅度进行抖动。

实现思路:

一、水平面的实现
这个是比较简单的,设定一定的高度,有超过此高度的则进行一个片原舍弃。但片元的高度的本地的坐标,真实对比的高度是世界坐标,因此这里需要有一个坐标的转换的操作。
设定一个值即当前点的裁剪的世界坐标高度,由外面的脚本传进来。
然后每个片元高度转成世界坐标与之对比,决定是否舍弃。
注意:要关掉背面片元裁剪,否则从上往下看时候,背面会不完整。

二、适应种容器
复制一个容器作为液体、把他缩小至比容器本身略小即可,用于放置这个液体Shader。

三、液体的左右抖动
以中心点的X值为基准,用当前点的X减去中心点的X可以得到一个距离(这个距离有正有负),这个距离用于影响问题一中的水平面高度。由外面传进来一个抖动的值(有正有负的)来影响这个抖动的幅度,正负用于控制抖动的方向,从而实现液体抖动的效果。

四、抖动的幅度计算(这部分用C#代码实现)
每次移动会把每帧的位置记录在lastPos中,并在数组中记录每一次的lastPos,再把当前位置赋给lastPos,直到lastPos等于当前位置,并置数组中有位置记录(这说明物体被移动过并移动完闭),这时算得数组中的所有记录平均值,可以得知这次移动的快慢,用于得到抖动的幅度。
浮动的左右摇摆用正弦波实现,幅度逐渐消弱。

核心代码:

//与中心点距离(_LevelOfWaterOffsetScale是有正负值的摆动比例)
float centerDistance = (worldPos.x -_LevelOfWaterX)*_LevelOfWaterOffsetScale;

//波动值影响裁剪高度
float heightOffset = _LevelOfWaterY +centerDistance;

//高于指定高度则裁剪
if(worldPos.y>heightOffset)clip(-1);

欢迎大家交流指正:QQ:262319244
希望能有更好的实现方式与我交流,同时征集液体水的实现思路,如下图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/98632525