diff options
Diffstat (limited to 'source/blender/draw/engines/gpencil/shaders')
4 files changed, 120 insertions, 0 deletions
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl index c2bf1dbc1a7..c8bc5e1fe91 100644 --- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl @@ -56,4 +56,7 @@ void main() outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416; FragColor = clamp(outcolor, 0, 1.0); + + if (outcolor.a < 0.02f) + discard; } diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl new file mode 100644 index 00000000000..237cdf15627 --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl @@ -0,0 +1,68 @@ +uniform mat4 ProjectionMatrix; +uniform mat4 ViewMatrix; + +/* ******************************************************************* */ +/* create glow mask */ +/* ******************************************************************* */ +uniform sampler2D strokeColor; +uniform sampler2D strokeDepth; + +uniform vec3 glow_color; +uniform vec3 select_color; +uniform float threshold; +uniform int mode; + +out vec4 FragColor; + +#define MODE_LUMINANCE 0 +#define MODE_COLOR 1 + +/* calc luminance */ +float luma( vec3 color ) { + /* the color is linear, so do not apply tonemapping */ + return (color.r + color.g + color.b) / 3.0; +} + +bool check_color(vec3 color_a, vec3 color_b) +{ + /* need round the number to avoid precision errors */ + if ((floor(color_a.r * 100) == floor(color_b.r * 100)) && + (floor(color_a.g * 100) == floor(color_b.g * 100)) && + (floor(color_a.b * 100) == floor(color_b.b * 100))) + { + return true; + } + + return false; +} + +void main() +{ + vec2 uv = vec2(gl_FragCoord.xy); + + float stroke_depth = texelFetch(strokeDepth, ivec2(uv.xy), 0).r; + vec4 src_pixel= texelFetch(strokeColor, ivec2(uv.xy), 0); + vec4 outcolor; + + /* is transparent */ + if (src_pixel.a == 0.0f) { + discard; + } + + if (mode == MODE_LUMINANCE) { + if (luma(src_pixel.rgb) < threshold) { + discard; + } + } + else if (mode == MODE_COLOR) { + if (!check_color(src_pixel.rgb, select_color.rgb)) { + discard; + } + } + else { + discard; + } + + gl_FragDepth = stroke_depth; + FragColor = vec4(glow_color.rgb, 1.0); +} diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl new file mode 100644 index 00000000000..010c4ef4a88 --- /dev/null +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl @@ -0,0 +1,46 @@ +/* ******************************************************************* */ +/* Resolve GLOW pass */ +/* ******************************************************************* */ +uniform sampler2D strokeColor; +uniform sampler2D strokeDepth; +uniform sampler2D glowColor; +uniform sampler2D glowDepth; +uniform int alpha_mode; + +out vec4 FragColor; + +void main() +{ + vec4 outcolor; + ivec2 uv = ivec2(gl_FragCoord.xy); + + float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r; + vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0); + vec4 glow_pixel= texelFetch(glowColor, uv.xy, 0); + float glow_depth = texelFetch(glowDepth, uv.xy, 0).r; + + if (alpha_mode == 0) { + outcolor = src_pixel + glow_pixel; + } + else { + if ((src_pixel.a < 0.1) || (glow_pixel.a < 0.1)) { + outcolor = src_pixel + glow_pixel; + } + else { + outcolor = src_pixel; + } + } + + if (src_pixel.a < glow_pixel.a) { + gl_FragDepth = glow_depth; + } + else { + gl_FragDepth = stroke_depth; + } + + if (outcolor.a < 0.001) { + discard; + } + + FragColor = outcolor; +} diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl index 882b2cf59f1..df5248c7791 100644 --- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl +++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl @@ -37,4 +37,7 @@ void main() FragColor = outcolor; gl_FragDepth = stroke_depth; + + if (outcolor.a < 0.02f) + discard; } |