江枫

ShaderToy – Heart Left

shader toy地址

1.静态雨滴

   所谓静态雨滴是体积较小,并不会滑落的水珠,随着时间流逝,体积慢慢变小直到消失。首先,确定静态雨滴所在位置。项目中给出的算法如下:

    大致思路是将整个Mesh分为40 40块小区域。每个小区域确定一个水珠位置坐标(项目中使用的算法为N13),该区域其它位置到水珠坐标的距离d作为模糊程度的判断依据。例如,项目中S(.3,0., d),即为:d>0.3时,c值为0,后续进行模糊处理的时候为最大模糊程度。

    雨滴数量过多时可进行进一步筛选。例如,项目中使用:frac(n.z
10.)删掉一些雨滴。

   接着,实现雨滴特征:可以倒影出部分窗外的物体。项目中采取的实现方式是:分别沿水平和垂直方向平移得到两个相同的雨滴,计算该区域的位置分别到这三个雨滴坐标距离的差。相关代码如下:

   根据上述内容,区域中其它位置到水珠坐标的距离d作为模糊程度的判断依据,越靠近值越大。即:圆心处值为1,圆上圆外值为0。如此根据代码可以得到一个UV值分布图:

   如图,黄色轴为v轴,代表u=0的线,为AB线段的中垂线,其上的点到AB两点的距离相同,故差值为0,u=0;同理蓝色轴为u轴,代表v=0的线。这样可以得到相应位置的采样方式,得到效果如图:

   在最终采样的时候加上原本的UV坐标即可:

   同样的,使用Lerp函数、smoothstep函数进行一些删减,得到效果如图:

2.动态雨滴

   所谓动态雨滴是体积较大,会向下滑落,最终移出可视区域的水珠。首先,雨滴形状与分布于上节描述大致相同(12* 2个),代码如下:

   区别在于雨滴位置的y值不再利用算法随机生成,而是一个固定值。引入时间变量t改变UV值,产生下落的动画效果。给雨滴位置的x值一个随着y值变化的偏移量wiggle,从而产生摆动效果。
   现实中的水珠下落,并不是这样匀速的。而是会停留等待一段时间,等到水珠变大后,加速下落一段距离然后再次停止。项目采用改变雨滴位置的y值来达到这样的效果,给雨滴位置的y值。加上一个偏移量,抵消掉下落距离(uv.y += t * 0.75;),保持雨滴位置不变。代码如下:

   这样的算法使得ti值为0~ 0.85时,雨滴位置上升,抵消下落距离,ti值为0.85~1时,雨滴位置下降,与下落距离相加,急速下落。
   接着实现滑落痕迹,思路与雨滴位置分布类似,根据距离体现出不同的模糊程度即可:

   最后为了使效果更加逼真,可以再下落的路径中随机产生一些静态雨滴,思路与上节描述类似,代码如下:

3.完整代码

文章大纲