第 4 课:Water Waves Interference
实现
uniform float iTime;
uniform sampler2D iChannel0;
const float PI = 3.14;
const float frequency = 10.0;
const float amplitude = 0.25;
const float speed = -3.0;
const float maxDistance = 0.5;
in vec2 vUv;
out vec4 FragColor;
float waveDistFromCenter(vec2 uv, vec2 center){
return sqrt(pow(uv.x - center.x,2.0) + pow(uv.y - center.y, 2.0));
}
float createDistortionByDist(float dist, float maxDist){
float A_attenuated = amplitude * clamp((1.0 - dist/maxDist),0.0, 1.0);
return A_attenuated * sin(dist * 2.0 * PI * frequency + speed * iTime);
}
void main() {
vec2 uv = vUv;
float dist1 = waveDistFromCenter(uv, vec2(0.3,0.3));
float dist2 = waveDistFromCenter(uv, vec2(0.7,0.7));
float maxDist = 0.5;
float distortion1 = createDistortionByDist(dist1, maxDist);
float distortion2 = createDistortionByDist(dist2, maxDist);
vec3 color = texture(iChannel0, uv + distortion1 + distortion2).rgb;
FragColor = vec4(color, 1.0);
}