e59cbef3e5ded31fd96f41b5d684aa3f97f16534
[blender.git] / source / blender / draw / engines / gpencil / shaders / fx / gpencil_fx_blur_frag.glsl
1 uniform mat4 ProjectionMatrix;
2 uniform mat4 ViewMatrix;
3
4 uniform sampler2D strokeColor;
5 uniform sampler2D strokeDepth;
6 uniform vec2 Viewport;
7
8 uniform int blur[2];
9
10 uniform vec3 loc;
11 uniform float pixsize;   /* rv3d->pixsize */
12 uniform float pixfactor;
13
14 float defaultpixsize = pixsize * (1000.0 / pixfactor);
15 vec2 noffset = vec2(blur[0], blur[1]);
16
17 out vec4 FragColor;
18
19 float get_zdepth(ivec2 poxy)
20 {
21         /* if outside viewport set as infinite depth */
22         if ((poxy.x < 0) || (poxy.x > Viewport.x)) {
23                 return 1.0f;
24         }
25         if ((poxy.y < 0) || (poxy.y > Viewport.y)) {
26                 return 1.0f;
27         }
28
29         float zdepth = texelFetch(strokeDepth, poxy, 0).r;
30         return zdepth;
31 }
32
33 void main()
34 {
35         ivec2 uv = ivec2(gl_FragCoord.xy);
36
37         vec4 nloc = ProjectionMatrix * ViewMatrix * vec4(loc.xyz, 1.0);
38
39         float dx = (ProjectionMatrix[3][3] == 0.0) ? (noffset[0] / (nloc.z * defaultpixsize)) : (noffset[0] / defaultpixsize);
40         float dy = (ProjectionMatrix[3][3] == 0.0) ? (noffset[1] / (nloc.z * defaultpixsize)) : (noffset[1] / defaultpixsize);
41
42         /* round to avoid shift when add more samples */
43         dx = floor(dx) + 1.0;
44         dy = floor(dy) + 1.0;
45
46         /* apply blurring, using a 9-tap filter with predefined gaussian weights */
47         /* depth (get the value of the surrounding pixels) */
48     float outdepth = 0.0;
49
50     outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
51     outdepth += get_zdepth(ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy)) * 0.118318;
52     outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
53     outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
54
55     outdepth += get_zdepth(ivec2(uv.x, uv.y)) * 0.147761;
56
57     outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
58     outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
59     outdepth += get_zdepth(ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy)) * 0.118318;
60     outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
61
62     gl_FragDepth = outdepth;
63
64         /* color */
65         vec4 outcolor = vec4(0.0);
66     outcolor += texelFetch(strokeColor, ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy), 0) * 0.0947416;
67     outcolor += texelFetch(strokeColor, ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy), 0) * 0.118318;
68     outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy), 0) * 0.0947416;
69     outcolor += texelFetch(strokeColor, ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy), 0) * 0.118318;
70
71     outcolor += texelFetch(strokeColor, ivec2(uv.x, uv.y), 0) * 0.147761;
72
73     outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy), 0) * 0.118318;
74     outcolor += texelFetch(strokeColor, ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416;
75     outcolor += texelFetch(strokeColor, ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy), 0) * 0.118318;
76     outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416;
77
78         FragColor = clamp(outcolor, 0, 1.0);
79
80         /* discar extreme values */
81         if (outcolor.a < 0.02f) {
82                 discard;
83         }
84         if ((outdepth <= 0.000001) || (outdepth  >= 0.999999)){
85                 discard;
86         }
87 }