GPencil: Remove blend_opacity from shader
[blender.git] / source / blender / draw / engines / gpencil / shaders / gpencil_blend_frag.glsl
1 in vec4 uvcoordsvar;
2
3 out vec4 FragColor;
4
5 uniform sampler2D strokeColor;
6 uniform sampler2D strokeDepth;
7 uniform sampler2D blendColor;
8 uniform sampler2D blendDepth;
9 uniform int mode;
10 uniform int clamp_layer;
11 uniform int tonemapping;
12
13 #define ON 1
14 #define OFF 0
15
16 #define MODE_REGULAR 0
17 #define MODE_OVERLAY 1
18 #define MODE_ADD 2
19 #define MODE_SUB 3
20 #define MODE_MULTIPLY 4
21 #define MODE_DIVIDE 5
22
23 float overlay_color(float a, float b)
24 {
25   float rtn;
26   if (a < 0.5) {
27     rtn = 2.0 * a * b;
28   }
29   else {
30     rtn = 1.0 - 2.0 * (1.0 - a) * (1.0 - b);
31   }
32
33   return rtn;
34 }
35
36 vec4 get_blend_color(int mode, vec4 src_color, vec4 blend_color)
37 {
38   vec4 mix_color = blend_color;
39   vec4 outcolor;
40
41   if (mix_color.a == 0) {
42     outcolor = src_color;
43   }
44   else if (mode == MODE_OVERLAY) {
45     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a);
46     outcolor.r = overlay_color(src_color.r, mix_color.r);
47     outcolor.g = overlay_color(src_color.g, mix_color.g);
48     outcolor.b = overlay_color(src_color.b, mix_color.b);
49     outcolor.a = src_color.a;
50   }
51   else if (mode == MODE_ADD) {
52     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a);
53     outcolor = src_color + mix_color;
54     outcolor.a = src_color.a;
55   }
56   else if (mode == MODE_SUB) {
57     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a);
58     outcolor = src_color - mix_color;
59     outcolor.a = clamp(src_color.a - mix_color.a, 0.0, 1.0);
60   }
61   else if (mode == MODE_MULTIPLY) {
62     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a);
63     outcolor = src_color * mix_color;
64     outcolor.a = src_color.a;
65   }
66   else if (mode == MODE_DIVIDE) {
67     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a);
68     outcolor = src_color / mix_color;
69     outcolor.a = src_color.a;
70   }
71   else {
72     outcolor = mix_color;
73     outcolor.a = src_color.a;
74   }
75
76   return clamp(outcolor, 0.0, 1.0);
77 }
78
79 float linearrgb_to_srgb(float c)
80 {
81   if (c < 0.0031308) {
82     return (c < 0.0) ? 0.0 : c * 12.92;
83   }
84   else {
85     return 1.055 * pow(c, 1.0 / 2.4) - 0.055;
86   }
87 }
88
89 vec4 tone(vec4 stroke_color)
90 {
91   if (tonemapping == 1) {
92     vec4 color = vec4(0, 0, 0, stroke_color.a);
93     color.r = linearrgb_to_srgb(stroke_color.r);
94     color.g = linearrgb_to_srgb(stroke_color.g);
95     color.b = linearrgb_to_srgb(stroke_color.b);
96     return color;
97   }
98   else {
99     return stroke_color;
100   }
101 }
102
103 void main()
104 {
105   vec4 outcolor;
106   ivec2 uv = ivec2(gl_FragCoord.xy);
107   vec4 stroke_color = texelFetch(strokeColor, uv, 0).rgba;
108   float stroke_depth = texelFetch(strokeDepth, uv, 0).r;
109
110   vec4 mix_color = texelFetch(blendColor, uv, 0).rgba;
111   float mix_depth = texelFetch(blendDepth, uv, 0).r;
112
113   /* Default mode */
114   if (mode == MODE_REGULAR) {
115     if (stroke_color.a > 0) {
116       if (mix_color.a > 0) {
117         /* premult */
118         stroke_color = vec4(vec3(stroke_color.rgb / stroke_color.a), stroke_color.a);
119         mix_color = vec4(vec3(mix_color.rgb / mix_color.a), mix_color.a);
120
121         FragColor = vec4(mix(stroke_color.rgb, mix_color.rgb, mix_color.a), stroke_color.a);
122         gl_FragDepth = mix_depth;
123       }
124       else {
125         FragColor = stroke_color;
126         gl_FragDepth = stroke_depth;
127       }
128     }
129     else {
130       if (clamp_layer == ON) {
131         discard;
132       }
133       else {
134         FragColor = mix_color;
135         gl_FragDepth = mix_depth;
136       }
137     }
138     FragColor = tone(FragColor);
139     return;
140   }
141
142   /* if not using mask, return mix color */
143   if ((stroke_color.a == 0) && (clamp_layer == OFF)) {
144     FragColor = tone(mix_color);
145     gl_FragDepth = mix_depth;
146     return;
147   }
148
149   /* apply blend mode */
150   FragColor = tone(get_blend_color(mode, stroke_color, mix_color));
151   gl_FragDepth = stroke_depth;
152 }