pub const BLEND: &str = r#"
float blend_1(int mode, float s, float d) {
if (mode == 1) { return s * d; } // Multiply
if (mode == 2) { return 1.0 - (1.0 - s) * (1.0 - d); } // Screen
if (mode == 3) { // Overlay
return (d <= 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d);
}
if (mode == 4) { return min(s, d); } // Darken
if (mode == 5) { return max(s, d); } // Lighten
if (mode == 6) { return min(s + d, 1.0); } // Add
if (mode == 7) { return max(d - s, 0.0); } // Subtract
if (mode == 8) { return abs(s - d); } // Difference
if (mode == 9) { // SoftLight
if (s <= 0.5) { return d - (1.0 - 2.0 * s) * d * (1.0 - d); }
float g = (d <= 0.25) ? ((16.0 * d - 12.0) * d + 4.0) * d : sqrt(d);
return d + (2.0 * s - 1.0) * (g - d);
}
if (mode == 10) { // HardLight
return (s <= 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d);
}
if (mode == 11) { // ColorDodge
if (d <= 0.0) { return 0.0; }
if (s >= 1.0) { return 1.0; }
return min(d / (1.0 - s), 1.0);
}
if (mode == 12) { // ColorBurn
if (d >= 1.0) { return 1.0; }
if (s <= 0.0) { return 0.0; }
return 1.0 - min((1.0 - d) / s, 1.0);
}
return s; // Normal
}
vec3 blend(int mode, vec3 s, vec3 d) {
if (mode == 0) { return s; }
return vec3(blend_1(mode, s.r, d.r), blend_1(mode, s.g, d.g), blend_1(mode, s.b, d.b));
}
"#;Expand description
Blend modes as a GLSL function (vec3 blend(int mode, vec3 s, vec3 d)) mirroring engine::blend.
The int is BlendMode::ALL’s index — see blend_index in engine/gpu.rs.