跳到主要内容
← Noise

Noise

FBM

shader-learning 自学第 15 课:FBM

实时渲染 · 2D 片段 GLSL

第 15 课:FBM

实现

uniform vec2 iResolution;
uniform float iTime;

const float ANIMATE = 1.0;

float fbm(float x) {
  float amplitude = 0.5;
  float frequency = 6.28;
  float lacunarity = 2.0;
  float gain = 1.0/2.0;

  float result = 0.0;
  for(int i = 0; i < 30; i++){
    lacunarity = pow(2.0,float(i));
    gain = pow(1.0/2.0,float(i));
    result += amplitude * gain * sin(frequency * lacunarity * x);
  }
  return result;
}

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;

  float DURATION = 10.0;
  float progress = mod(iTime, DURATION) / DURATION;
  float flip = mod(floor(iTime / DURATION), 2.0);
  progress = mix(progress, 1.0 - progress, flip);
  progress = pow(progress, 4.0);
  progress *= ANIMATE;

  float z = 1.0 + mix(0.0, 500.0, progress);
  float center = 0.5;
  float x = (uv.x - center) / z + center + 0.049201;
  float y = (fbm(x) - 0.123436) * z + 0.5;

  float stroke = 5.0;
  float t = 1.0 - step(stroke / iResolution.y, abs(uv.y - y));

  gl_FragColor = vec4(t, 0.0, 0.0, t);
}