Shader实现瓶内液体效果

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

完整原码地址:

https://blog.csdn.net/ww1351646544/article/details/104917031
2022年02月07日补充:
https://download.csdn.net/download/ww1351646544/79578284
继说明和原码说明后仍有部分小伙伴不明白,可以此下载Demo进行参考。

需求:

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
希望能有更好的实现方式与我交流,同时征集液体水的实现思路,如下图:
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值