Functions for blending two color vectors 'target' and 'blend'. Original code by ridhojeftha: https://www.shadertoy.com/view/4tSGWV
//Darken
vector darken(vector target, blend){
return min(target, blend);
}
//Multiply
vector multiply(vector target, blend){
return target * blend;
}
//Color Burn
vector color_burn(vector target, blend){
return 1.0 - (1.0 - target)/ blend;
}
//Linear Burn
vector linear_burn(vector target, blend){
return target + blend - 1.0;
}
//Lighten
vector lighten(vector target, blend){
return max (target, blend);
}
//Screen
vector screen(vector target, blend){
return 1.0 - (1.0 - target) * (1.0 - blend);
}
//Color Dodge
vector color_dodge(vector target, blend){
return target / (1.0 - blend);
}
//Linear Dodge
vector linear_dodge(vector target, blend){
return target + blend;
}
//Overlay
vector overlay(vector target, blend){
vector temp;
temp.x = (target.x > 0.5) ? (1.0-(1.0-2.0*(target.x-0.5))*(1.0-blend.x)) : (2.0*target.x)*blend.x;
temp.y = (target.y > 0.5) ? (1.0-(1.0-2.0*(target.y-0.5))*(1.0-blend.y)) : (2.0*target.y)*blend.y;
temp.z = (target.z > 0.5) ? (1.0-(1.0-2.0*(target.z-0.5))*(1.0-blend.z)) : (2.0*target.z)*blend.z;
return temp;
}
//Soft Light
vector soft_light(vector target, blend){
vector temp;
temp.x = (blend.x > 0.5) ? (1.0-(1.0-target.x)*(1.0-(blend.x-0.5))) : (target.x * (blend.x + 0.5));
temp.y = (blend.y > 0.5) ? (1.0-(1.0-target.y)*(1.0-(blend.y-0.5))) : (target.y * (blend.y + 0.5));
temp.z = (blend.z > 0.5) ? (1.0-(1.0-target.z)*(1.0-(blend.z-0.5))) : (target.z * (blend.z + 0.5));
return temp;
}
//Hard Light
vector hard_light(vector target, blend){
vector temp;
temp.x = (blend.x > 0.5) ? (1.0-(1.0-target.x)*(1.0-2.0*(blend.x-0.5))) : (target.x * (2.0*blend.x));
temp.y = (blend.y > 0.5) ? (1.0-(1.0-target.y)*(1.0-2.0*(blend.y-0.5))) : (target.y * (2.0*blend.y));
temp.z = (blend.z > 0.5) ? (1.0-(1.0-target.z)*(1.0-2.0*(blend.z-0.5))) : (target.z * (2.0*blend.z));
return temp;
}
//Vivid Light
vector vivid_light(vector target, blend){
vector temp;
temp.x = (blend.x > 0.5) ? (1.0-(1.0-target.x)/(2.0*(blend.x-0.5))) : (target.x / (1.0-2.0*blend.x));
temp.y = (blend.y > 0.5) ? (1.0-(1.0-target.y)/(2.0*(blend.y-0.5))) : (target.y / (1.0-2.0*blend.y));
temp.z = (blend.z > 0.5) ? (1.0-(1.0-target.z)/(2.0*(blend.z-0.5))) : (target.z / (1.0-2.0*blend.z));
return temp;
}
//Linear Light
vector linear_light(vector target, blend){
vector temp;
temp.x = (blend.x > 0.5) ? (target.x)+(2.0*(blend.x-0.5)) : (target.x +(2.0*blend.x-1.0));
temp.y = (blend.y > 0.5) ? (target.y)+(2.0*(blend.y-0.5)) : (target.y +(2.0*blend.y-1.0));
temp.z = (blend.z > 0.5) ? (target.z)+(2.0*(blend.z-0.5)) : (target.z +(2.0*blend.z-1.0));
return temp;
}
//Pin Light
vector pin_light(vector target, blend){
vector temp;
temp.x = (blend.x > 0.5) ? (max (target.x, 2.0*(blend.x-0.5))) : (min(target.x, 2.0*blend.x));
temp.y = (blend.y > 0.5) ? (max (target.y, 2.0*(blend.y-0.5))) : (min(target.y, 2.0*blend.y));
temp.z = (blend.z > 0.5) ? (max (target.z, 2.0*(blend.z-0.5))) : (min(target.z, 2.0*blend.z));
return temp;
}
//Difference
vector difference(vector target, blend){
return abs(target - blend);
}
//Exclusion
vector exclusion(vector target, blend){
return 0.5 - 2.0*(target-0.5)*(blend-0.5);
}
//Subtract
vector subtract(vector target, blend){
return target - blend;
}
//Divide
vector divide(vector target, blend){
return target / blend;
}