uniform float opacity; uniform sampler2D tMatcap; uniform vec3 color; varying vec2 vNormal; vec4 screen(vec4 b, vec4 s) { return b + s - (b * s); } vec4 multiply(vec4 b, vec4 s) { return b * s; } // source https://www.w3.org/TR/compositing-1/#blendingdarken vec4 hardLight(vec4 b, vec4 s) { if (length(s) < .5) { return multiply(b, 2. * s); } else { return screen(b, 2. * s - 1.); } } void main() { vec4 matcap = texture2D(tMatcap, vNormal); vec4 coloredMatcap = hardLight(matcap, vec4(color, 1.)); gl_FragColor = vec4(coloredMatcap.rgb, opacity); }