 // outside of what currently has color
 
 void main(void) {
-    fragColor = composite(texture(iChannel[2], uv) * mix(0.95, 0.995, iIntensity), texture(iInput, uv));
+    vec4 oldC = texture(iChannel[2], uv);
+    float d = mix(0.01, 0.001, iIntensity);
+    oldC = max(oldC - d, vec4(0.));
+    vec4 newC = texture(iInput, uv);
+    fragColor = max(oldC, newC);
 }

    float alive = texture(iChannel[1], uv).r;
    vec4 under = texture(iInput, uv);
    vec4 over = alive * texture(iChannel[2], uv);
    fragColor = mix(under, over, smoothstep(0., 0.2, iIntensity));
}

#buffershader


    // Make there be life if there is sufficient input color
    //float lifeFromInput = step(0.5, smoothstep(0., 3., dot(vec3(1.), source.rgb)));
    float lifeFromInput = step(0.8, max(source.r, max(source.g, source.b)));
    alive = max(alive, lifeFromInput);
    alive *= step(0.01, texture(iChannel[2], normCoord).a); // Kill stable life if there is no color

    fragColor.gba = vec3(1.0);
    fragColor.r = alive;
