0.00
60.0 fps

Fire Effect

Amiga Like effect

Log in to post a comment.

#version 300 es
precision highp float;

// Forked from "Plasma" by mintymighty
// https://oneshader.net/shader/7c2e46eb0d


uniform float  iTime;
uniform vec2   iResolution;
out vec4       fragColor;

// 2D pseudorandom
float rand(vec2 p){
    return fract(sin(dot(p, vec2(127.1,311.7))) * 43758.5453123);
}

// Smooth noise
float noise(vec2 p){
    vec2 i = floor(p);
    vec2 f = fract(p);
    // corners
    float a = rand(i + vec2(0.0,0.0));
    float b = rand(i + vec2(1.0,0.0));
    float c = rand(i + vec2(0.0,1.0));
    float d = rand(i + vec2(1.0,1.0));
    // smooth interp
    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;
}

// 4-octave fBm
float fbm(vec2 p){
    float v = 0.0;
    float a = 0.5;
    for(int i = 0; i < 4; i++){
        v += a * noise(p);
        p *= 2.0;
        a *= 0.5;
    }
    return v;
}

// Fire palette: black → red → orange → yellow → white
vec3 firePalette(float t){
    if(t < 0.3){
        // black to dark red
        return mix(vec3(0.0), vec3(0.8, 0.0, 0.0), t/0.3);
    }
    else if(t < 0.6){
        // dark red to orange
        return mix(vec3(0.8,0.0,0.0), vec3(1.0,0.6,0.0), (t-0.3)/0.3);
    }
    else if(t < 0.85){
        // orange to yellow
        return mix(vec3(1.0,0.6,0.0), vec3(1.0,1.0,0.2), (t-0.6)/0.25);
    }
    else {
        // yellow to white
        return mix(vec3(1.0,1.0,0.2), vec3(1.0), (t-0.85)/0.15);
    }
}

void main(){
    // normalized uv (0 at bottom)
    vec2 uv = gl_FragCoord.xy / iResolution.xy;
    // stretch vertically to give more “height”
    vec2 p = uv * vec2(1.0, 1.5);

    // move noise upwards over time, and add a twisting motion
    float n = fbm(p * 3.0 - vec2(0.0, iTime * 1.5) + 
                  vec2(sin(iTime*0.5)*0.5, 0.0));

    // create a sharp cutoff so fire “dies” toward the top
    float cutoff = smoothstep(0.0, 1.0, n - (1.0 - uv.y*1.2));

    // optionally boost contrast
    float fire = pow(cutoff, 1.5);

    // palette lookup
    vec3 col = firePalette(fire);

    fragColor = vec4(col, 1.0);
}