效果图如下:
我加以完善。说一下大体思路:
用mesh填充:
用mesh伪造一个液体,仅仅渲染Line下面的mesh,o.Line = worldPosRotated.y +_FillAmount, 我们使用unity "fixed facing : VFACE", 渲染表面朝向相机为正,背对相机为负。 "return face > 0" ? FrontFaceColor : backFaceColor
移动和正弦波:
在物体移动的时候计算速度和角速度。把这个速度增加到 Wobble Float 的 X和Z。 随着时间的推移用这个值和0 做插值,并乘以正弦波,发送Sine Wave 到 Shader。 "wobble" = Math.Lerp(wobble, 0, Time.deltaTime); sinWobble = wobble Mathf.Sin(pulse time);"
摆动:
Fill Line旋转,用World position乘以 Sine Wave 加上 world position 根据物体运动摆动"Liquid" "worldPosRotated = worldPos + (worldPosX SineX)+ (worldPosZ _SineZ);"
玻璃瓶:
把物体转换到视图空间,物体顶点坐标x,y沿着法线扩展 float2 thickness = TransformViewToProjection(mvnormal.xy); o.pos.xy += thickness * _ThickFator 双面渲染:Cull off 透明:AlphaToMask On
至此文章讲解完毕,如有不足请大家指出。都看到这里了,点赞收藏吧! 附上git上工程地址:https://github.com/lu-yu01/Unity_Shader_Demo
Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐