眨眼有很多实现方法,下面介绍通过简单的算法来实现该功能。
先介绍下shader中的 mod函数
:
float mod(float x, float y) {
return x - y * floor(x / y);
}
函数所返回的结果直接上图,下图为 mod(x, 6)
的结果:
可以看到mod的计算结果与frac函数类似,只不过frac函数返回0~1的区间,而 mod(a, b)
返回0 ~ b的区间。
根据这个特性,我们可以把shadertoy中的iTime代入。得到的结果会从0 ~ 6往复运动,即从0 ~ 6经历6秒。
了解这个特性后,我们可以结合smoothstep函数进行眨眼的动画实现:
float s = mod(iTime, 6)
float sm = smoothstep(0, 0.1, s)-smoothstep(0.18, 0.2, s)
上述的代码也就是间隔 5.8s
会眨一次眼睛。要缩短间隔可以把mod函数的第二个参数改小。眨眼示例代码如下
float stepAnim = mod(iTime, 4.);
float animEyelid = smoothstep(0.1, 0.2, stepAnim)-smoothstep(0.28, 0.35, stepAnim);
float topEyelid = max(eyelid, dot(ap-vec3(0., 1.33-animEyelid*0.07, 0.), normalize(vec3(0., -1., 0.))));
float bottomEyelid = max(eyelid, dot(ap-vec3(0., 1.2+animEyelid*0.05, 0.), normalize(vec3(0., 1., 0.))));