跳到主要内容
← Water

Water

Water Waves Interference

shader-learning 自学第 4 课:Water Waves Interference

实时渲染 · 纹理 GLSL

第 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);
}