|
export default `// |
|
// https://github.com/jamieowen/glsl-blend |
|
// |
|
|
|
// Normal |
|
|
|
vec3 blendNormal(vec3 base, vec3 blend) { |
|
return blend; |
|
} |
|
|
|
vec3 blendNormal(vec3 base, vec3 blend, float opacity) { |
|
return (blendNormal(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Screen |
|
|
|
float blendScreen(float base, float blend) { |
|
return 1.0-((1.0-base)*(1.0-blend)); |
|
} |
|
|
|
vec3 blendScreen(vec3 base, vec3 blend) { |
|
return vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendScreen(vec3 base, vec3 blend, float opacity) { |
|
return (blendScreen(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Multiply |
|
|
|
vec3 blendMultiply(vec3 base, vec3 blend) { |
|
return base*blend; |
|
} |
|
|
|
vec3 blendMultiply(vec3 base, vec3 blend, float opacity) { |
|
return (blendMultiply(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Overlay |
|
|
|
float blendOverlay(float base, float blend) { |
|
return base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend)); |
|
} |
|
|
|
vec3 blendOverlay(vec3 base, vec3 blend) { |
|
return vec3(blendOverlay(base.r,blend.r),blendOverlay(base.g,blend.g),blendOverlay(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendOverlay(vec3 base, vec3 blend, float opacity) { |
|
return (blendOverlay(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Hard light |
|
|
|
vec3 blendHardLight(vec3 base, vec3 blend) { |
|
return blendOverlay(blend,base); |
|
} |
|
|
|
vec3 blendHardLight(vec3 base, vec3 blend, float opacity) { |
|
return (blendHardLight(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Soft light |
|
|
|
float blendSoftLight(float base, float blend) { |
|
return (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend)); |
|
} |
|
|
|
vec3 blendSoftLight(vec3 base, vec3 blend) { |
|
return vec3(blendSoftLight(base.r,blend.r),blendSoftLight(base.g,blend.g),blendSoftLight(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendSoftLight(vec3 base, vec3 blend, float opacity) { |
|
return (blendSoftLight(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Color dodge |
|
|
|
float blendColorDodge(float base, float blend) { |
|
return (blend==1.0)?blend:min(base/(1.0-blend),1.0); |
|
} |
|
|
|
vec3 blendColorDodge(vec3 base, vec3 blend) { |
|
return vec3(blendColorDodge(base.r,blend.r),blendColorDodge(base.g,blend.g),blendColorDodge(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendColorDodge(vec3 base, vec3 blend, float opacity) { |
|
return (blendColorDodge(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Color burn |
|
|
|
float blendColorBurn(float base, float blend) { |
|
return (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0); |
|
} |
|
|
|
vec3 blendColorBurn(vec3 base, vec3 blend) { |
|
return vec3(blendColorBurn(base.r,blend.r),blendColorBurn(base.g,blend.g),blendColorBurn(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendColorBurn(vec3 base, vec3 blend, float opacity) { |
|
return (blendColorBurn(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Vivid Light |
|
|
|
float blendVividLight(float base, float blend) { |
|
return (blend<0.5)?blendColorBurn(base,(2.0*blend)):blendColorDodge(base,(2.0*(blend-0.5))); |
|
} |
|
|
|
vec3 blendVividLight(vec3 base, vec3 blend) { |
|
return vec3(blendVividLight(base.r,blend.r),blendVividLight(base.g,blend.g),blendVividLight(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendVividLight(vec3 base, vec3 blend, float opacity) { |
|
return (blendVividLight(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Lighten |
|
|
|
float blendLighten(float base, float blend) { |
|
return max(blend,base); |
|
} |
|
|
|
vec3 blendLighten(vec3 base, vec3 blend) { |
|
return vec3(blendLighten(base.r,blend.r),blendLighten(base.g,blend.g),blendLighten(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendLighten(vec3 base, vec3 blend, float opacity) { |
|
return (blendLighten(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Linear burn |
|
|
|
float blendLinearBurn(float base, float blend) { |
|
// Note : Same implementation as BlendSubtractf |
|
return max(base+blend-1.0,0.0); |
|
} |
|
|
|
vec3 blendLinearBurn(vec3 base, vec3 blend) { |
|
// Note : Same implementation as BlendSubtract |
|
return max(base+blend-vec3(1.0),vec3(0.0)); |
|
} |
|
|
|
vec3 blendLinearBurn(vec3 base, vec3 blend, float opacity) { |
|
return (blendLinearBurn(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Linear dodge |
|
|
|
float blendLinearDodge(float base, float blend) { |
|
// Note : Same implementation as BlendAddf |
|
return min(base+blend,1.0); |
|
} |
|
|
|
vec3 blendLinearDodge(vec3 base, vec3 blend) { |
|
// Note : Same implementation as BlendAdd |
|
return min(base+blend,vec3(1.0)); |
|
} |
|
|
|
vec3 blendLinearDodge(vec3 base, vec3 blend, float opacity) { |
|
return (blendLinearDodge(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
|
|
// Linear light |
|
|
|
float blendLinearLight(float base, float blend) { |
|
return blend<0.5?blendLinearBurn(base,(2.0*blend)):blendLinearDodge(base,(2.0*(blend-0.5))); |
|
} |
|
|
|
vec3 blendLinearLight(vec3 base, vec3 blend) { |
|
return vec3(blendLinearLight(base.r,blend.r),blendLinearLight(base.g,blend.g),blendLinearLight(base.b,blend.b)); |
|
} |
|
|
|
vec3 blendLinearLight(vec3 base, vec3 blend, float opacity) { |
|
return (blendLinearLight(base, blend) * opacity + base * (1.0 - opacity)); |
|
} |
|
`; |
|
|