Differential D2889 Diff 11446 source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_resolve_frag.glsl
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_rim_resolve_frag.glsl
- This file was added.
| /* ******************************************************************* */ | |||||
| /* Resolve RIM pass and add blur if needed */ | |||||
| /* ******************************************************************* */ | |||||
| uniform sampler2D strokeColor; | |||||
| uniform sampler2D strokeDepth; | |||||
| uniform sampler2D strokeRim; | |||||
| uniform vec3 mask_color; | |||||
| uniform int mode; | |||||
| out vec4 FragColor; | |||||
| #define MODE_NORMAL 0 | |||||
| #define MODE_OVERLAY 1 | |||||
| #define MODE_ADD 2 | |||||
| #define MODE_SUB 3 | |||||
| #define MODE_MULTIPLY 4 | |||||
| #define MODE_DIVIDE 5 | |||||
| float overlay_color(float a, float b) | |||||
| { | |||||
| float rtn; | |||||
| if (a < 0.5) { | |||||
| rtn = 2.0 * a * b; | |||||
| } | |||||
| else { | |||||
| rtn = 1.0 - 2.0 * (1.0 - a) * (1.0 - b); | |||||
| } | |||||
| return rtn; | |||||
| } | |||||
| vec4 get_blend_color(int mode, vec4 src_color, vec4 mix_color) | |||||
| { | |||||
| vec4 outcolor; | |||||
| if (mode == MODE_NORMAL) { | |||||
| outcolor = mix_color; | |||||
| } | |||||
| else if (mode == MODE_OVERLAY) { | |||||
| outcolor.r = overlay_color(src_color.r, mix_color.r); | |||||
| outcolor.g = overlay_color(src_color.g, mix_color.g); | |||||
| outcolor.b = overlay_color(src_color.b, mix_color.b); | |||||
| } | |||||
| else if (mode == MODE_ADD){ | |||||
| outcolor = src_color + mix_color; | |||||
| } | |||||
| else if (mode == MODE_SUB){ | |||||
| outcolor = src_color - mix_color; | |||||
| } | |||||
| else if (mode == MODE_MULTIPLY) { | |||||
| outcolor = src_color * mix_color; | |||||
| } | |||||
| else if (mode == MODE_DIVIDE) { | |||||
| outcolor = src_color / mix_color; | |||||
| } | |||||
| else { | |||||
| outcolor = mix_color; | |||||
| } | |||||
| /* use always the alpha of source color */ | |||||
| outcolor.a = src_color.a; | |||||
| /* use alpha to calculate the weight of the mixed color */ | |||||
| outcolor = mix(src_color, outcolor, mix_color.a); | |||||
| return outcolor; | |||||
| } | |||||
| void main() | |||||
| { | |||||
| ivec2 uv = ivec2(gl_FragCoord.xy); | |||||
| float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r; | |||||
| vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0); | |||||
| vec4 rim_pixel= texelFetch(strokeRim, uv.xy, 0); | |||||
| vec4 outcolor = src_pixel; | |||||
| /* is transparent */ | |||||
| if (src_pixel.a == 0.0f) { | |||||
| discard; | |||||
| } | |||||
| /* pixel is equal to mask color, keep */ | |||||
| else if (src_pixel.rgb == mask_color.rgb) { | |||||
| outcolor = src_pixel; | |||||
| } | |||||
| else { | |||||
| if (rim_pixel.a == 0.0f) { | |||||
| outcolor = src_pixel; | |||||
| } | |||||
| else { | |||||
| outcolor = get_blend_color(mode, src_pixel, rim_pixel); | |||||
| } | |||||
| } | |||||
| gl_FragDepth = stroke_depth; | |||||
| FragColor = outcolor; | |||||
| } | |||||