UNPKG

vanta

Version:

3D animated backgrounds for your website

59 lines (51 loc) 2 kB
import ShaderBase, {VANTA} from './_shaderBase.js' class Effect extends ShaderBase {} export default VANTA.register('RIPPLE', Effect) Effect.prototype.defaultOptions = { color1: 0x60b25, color2: 0xffffff, backgroundColor: 0xf6f6f6, amplitudeFactor: 1.0, ringFactor: 4.0, rotationFactor: 0.1, speed: 1.0, scaleMobile: 4 } Effect.prototype.fragmentShader = `\ uniform vec2 iResolution; uniform vec2 iMouse; uniform float iTime; uniform float blurFactor; uniform vec3 color1; uniform vec3 color2; uniform vec3 backgroundColor; uniform float amplitudeFactor; uniform float ringFactor; uniform float rotationFactor; float size = 0.002; void main( void ) { vec2 view = ( gl_FragCoord.xy - iResolution / 2.0 ) / ( iResolution.y / 2.0); float time = - iTime + length(view)*8. - 7.0; vec4 color = vec4(0); vec2 center = vec2(0); float accumMix = 0.0; float rotationVelocity = 2.0; for( int j = 0; j < 20; j++ ) { for( int i = 0; i < 20; i++ ) { float amplitude = ( cos( time / 10.0 ) + sin( time /5.0 ) ); amplitude = amplitude * amplitudeFactor; float angle = sin( float(j) * time * 0.05 * ringFactor) * rotationVelocity + 2.0 * 3.14 * float(i) / 20.0; center.x = cos( 7.0 * float(j) / 20.0 * 2.0 * 3.14 ) + sin( time / 4.0) * rotationFactor; center.y = sin( 3.0 * float(j) / 20.0 * 2.0 * 3.14 )+ cos( time / 8.0) * rotationFactor; vec2 light = center + amplitude * vec2( cos( angle ), sin( angle )); // size = sin( time ) * 0.005; float l = size / length( view - light ); accumMix += l * 0.5; } } float accumMix1 = pow(clamp(accumMix * 1.2, 0., 1.15), 1.5); // lowlights float accumMix2 = pow(clamp(accumMix1 * 1.2, 0., 1.15), 3.0); // highlights vec3 lowlights = mix(backgroundColor, color2, clamp(accumMix1, -0.1, 1.15)); gl_FragColor = vec4(mix(lowlights, color1, clamp(accumMix2, -0.1, 1.15)), 1); } `