跳到主要内容
← Water

Water

Water Surface Normal

shader-learning 自学第 5 课:Water Surface Normal

实时渲染 · 网格 GLSL

第 5 课:Water Surface Normal

实现

uniform float iTime;
uniform sampler2D iChannel0;
uniform sampler2D iChannel1;
uniform mat4 inverseViewMatrix;

const float PI = 3.14;
const float frequency = 8.0;
const float amplitude = 0.1;
const float speed = -3.0;
const float maxDistance = 0.5;

in vec2 vUv;
in vec3 vPos;

out vec4 FragColor;

vec3 getViewPos() {
  return (inverseViewMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
}

float getAmplitude(float distanceToOrigin) {
  return amplitude * clamp((1.0 - distanceToOrigin / maxDistance), 0.0, 1.0);
}

vec3 createDistortionByDist(vec2 uv, vec2 center, float maxDist){
  float dist = sqrt(pow(uv.x - center.x,2.0) + pow(uv.y -  center.y, 2.0));
  float A_attenuated = amplitude * clamp((1.0 - dist/maxDist),0.0, 1.0);

  vec2 d = A_attenuated * cos(dist * 2.0 * PI * frequency + speed * iTime) * ((2.0 * PI * frequency)/dist) * (uv - center);
  return normalize(vec3(-d.x, 1.0, -d.y));
}

void main() {
  vec2 uv = vUv;
  vec3 viewPos = getViewPos();
  float maxDist = 0.5;
  vec3 distortion1 = normalize(createDistortionByDist(uv,vec2(0.3), maxDist));
  vec3 distortion2 = normalize(createDistortionByDist(uv,vec2(0.7), maxDist));
  vec3 normal = normalize(distortion1 + distortion2);
  FragColor = vec4(normal,1.0);
}