Toshihiro Shimizu 890ddd
#ifdef GL_ES
Toshihiro Shimizu 890ddd
precision mediump float;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Tweaked from  http://glsl.heroku.com/e#6051.0
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Posted by Trisomie21 : 2D noise experiment (pan/zoom)
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// failed attempt at faking caustics
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
uniform mat3 outputToWorld;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
uniform vec4  color;
Toshihiro Shimizu 890ddd
uniform float time;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
vec4 textureRND2D(vec2 uv){
Toshihiro Shimizu 890ddd
	uv = floor(uv);
Toshihiro Shimizu 890ddd
	float v = uv.x+uv.y*1e3;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  // Build space-specific corner values
Toshihiro Shimizu 890ddd
  vec4 res = fract(1e5*sin(vec4(v*1e-2, (v+1.)*1e-2, (v+1e3)*1e-2, (v+1e3+1.)*1e-2)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  // Add 'sawtooth-like'  wavefronts evolution
Toshihiro Shimizu 890ddd
  return 2.0 * abs(fract(res + vec4(time * .03)) - 0.5);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
float noise(vec2 p) {
Toshihiro Shimizu 890ddd
  vec4 r = textureRND2D(p);                           // Noise values at cell corners
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  vec2 f = fract(p);
Toshihiro Shimizu 890ddd
	f = f*f*(3.0-2.0*f);                                // aka the smoothstep() builtin function
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
	return (mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
float buildColor(vec2 p) {
Toshihiro Shimizu 890ddd
  p += noise(p);                                      // Noising p itself first. This helps
Toshihiro Shimizu 890ddd
                                                      // preventing grid-like patterns.
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
	float v = 1.0 - abs(pow(abs(noise(p) - 0.5), 0.75)) * 1.7;  // Lots of magical constants  o_o?
Toshihiro Shimizu 890ddd
	return v;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const float SPEED   = .15;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void main( void ) {
Toshihiro Shimizu 890ddd
	vec2 p = (outputToWorld * vec3(gl_FragCoord.xy, 1.0)).xy;
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
	float c1 = buildColor(p*.03 + time * SPEED);
Toshihiro Shimizu 890ddd
	float c2 = buildColor(p*.03 - time * SPEED);
Toshihiro Shimizu 890ddd
	
Toshihiro Shimizu 890ddd
	float c3 = buildColor(p*.02 - time * SPEED);
Toshihiro Shimizu 890ddd
	float c4 = buildColor(p*.02 + time * SPEED);
Toshihiro Shimizu 890ddd
	
Toshihiro Shimizu 890ddd
	float cf = pow(c1*c2*c3*c4+0.5,6.);                 // Yep this is bad. Explicitly
Toshihiro Shimizu 890ddd
                                                      // dependent on the 4 above. Better?
Toshihiro Shimizu 890ddd
	vec3 c = vec3(cf);
Toshihiro Shimizu 890ddd
	gl_FragColor = vec4(c, 0.0) + color;
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  gl_FragColor.rgb *= gl_FragColor.a;                 // Premultiplication
Toshihiro Shimizu 890ddd
}