#define DISPLACEMENT 0.05
#define TIGHTNESS 10.0
uniform float yOffset;
uniform float yScale;
uniform float Speed;
uniform vec3 FlameTone;
uniform sampler2D image;
uniform vec2 resolution;
uniform float time;
float shape(in vec2 pos) // a blob shape to distort
{
return clamp( sin(pos.x*3.1416) - pos.y+yOffset, 0.0, 1.0 );
}
float noise( in vec3 x ) // iq noise function
{
vec3 p = floor(x);
vec3 f = fract(x);
f = f*f*(3.0-2.0*f);
vec2 uv = (p.xy+vec2(37.0,17.0)*p.z) + f.xy;
vec2 rg = texture2D( image, (uv+ 0.5)/256.0, -100.0 ).yx;
return mix( rg.x, rg.y, f.z ) * 2.0 - 1.0;
}
void main()
{
vec2 uv = gl_FragCoord.xy / resolution;
float nx = 0.0;
float ny = 0.0;
for (int i=1; i<13; i++)
{
float ii = pow(float(i), 2.0);
float ifrac = float(i)/float(12);
float t = ifrac * time * Speed;
float d = (1.0-ifrac) * DISPLACEMENT;
nx += noise( vec3(uv.x*ii-time*ifrac, uv.y*yScale*ii-t, 0.0)) * d * 2.0;
ny += noise( vec3(uv.x*ii+time*ifrac, uv.y*yScale*ii-t, time*ifrac/ii)) * d;
}
float flame = shape( vec2(uv.x+nx, uv.y+ny) );
vec3 col = pow(flame, TIGHTNESS) * FlameTone;
// tonemapping
col = col / (1.0+col);
col = pow(col, vec3(1.0/2.2));
col = clamp(col, 0.0, 1.0);
gl_FragColor = vec4(col, 1.0);
}