vanta
Version: 
3D animated backgrounds for your website
110 lines (88 loc) • 2.61 kB
JavaScript
// http://thebookofshaders.com/13/
// Original effect by Patricio Gonzalez Vivo
import ShaderBase, {VANTA} from './_shaderBase.js'
class Fog extends ShaderBase {}
export default VANTA.register('FOG', Fog)
Fog.prototype.defaultOptions = {
  highlightColor: 0xffc300, // 0xaaffff
  midtoneColor: 0xff1f00, // 0x00002a
  lowlightColor: 0x2d00ff, // 0xaaaa7e
  baseColor: 0xffebeb, // 0x1a9eaa
  blurFactor: 0.6,
  speed: 1.0,
  zoom: 1.0,
  scale: 2,
  scaleMobile: 4
};
Fog.prototype.fragmentShader = `\
uniform vec2 iResolution;
uniform vec2 iMouse;
uniform float iTime;
uniform float blurFactor;
uniform vec3 baseColor;
uniform vec3 lowlightColor;
uniform vec3 midtoneColor;
uniform vec3 highlightColor;
uniform float zoom;
float random (in vec2 _st) {
  return fract(sin(dot(_st.xy,
                        vec2(12.9898,78.233)))*
      43758.5453123);
}
// Based on Morgan McGuire @morgan3d
// https://www.shadertoy.com/view/4dS3Wd
float noise (in vec2 _st) {
  vec2 i = floor(_st);
  vec2 f = fract(_st);
  // Four corners in 2D of a tile
  float a = random(i);
  float b = random(i + vec2(1.0, 0.0));
  float c = random(i + vec2(0.0, 1.0));
  float d = random(i + vec2(1.0, 1.0));
  vec2 u = f * f * (3.0 - 2.0 * f);
  return mix(a, b, u.x) +
          (c - a)* u.y * (1.0 - u.x) +
          (d - b) * u.x * u.y;
}
float fbm ( in vec2 _st) {
  float v = 0.0;
  float a = blurFactor;
  vec2 shift = vec2(100.0);
  // Rotate to reduce axial bias
  mat2 rot = mat2(cos(0.5), sin(0.5),
                  -sin(0.5), cos(0.50));
  for (int i = 0; i < NUM_OCTAVES; ++i) {
      v += a * noise(_st);
      _st = rot * _st * 2.0 + shift;
      a *= (1. - blurFactor);
  }
  return v;
}
void main() {
  vec2 st = gl_FragCoord.xy / iResolution.xy*3.;
  st.x *= 0.7 * iResolution.x / iResolution.y ; // Still keep it more landscape than square
  st *= zoom;
  // st += st * abs(sin(iTime*0.1)*3.0);
  vec3 color = vec3(0.0);
  vec2 q = vec2(0.);
  q.x = fbm( st + 0.00*iTime);
  q.y = fbm( st + vec2(1.0));
  vec2 dir = vec2(0.15,0.126);
  vec2 r = vec2(0.);
  r.x = fbm( st + 1.0*q + vec2(1.7,9.2)+ dir.x*iTime );
  r.y = fbm( st + 1.0*q + vec2(8.3,2.8)+ dir.y*iTime);
  float f = fbm(st+r);
  color = mix(baseColor,
              lowlightColor,
              clamp((f*f)*4.0,0.0,1.0));
  color = mix(color,
              midtoneColor,
              clamp(length(q),0.0,1.0));
  color = mix(color,
              highlightColor,
              clamp(length(r.x),0.0,1.0));
  vec3 finalColor = mix(baseColor, color, f*f*f+.6*f*f+.5*f);
  gl_FragColor = vec4(finalColor,1.0);
}
`;