Depth of field high quality:
[blender.git] / source / blender / gpu / shaders / gpu_shader_fx_dof_hq_geo.glsl
1 uniform ivec2 rendertargetdim;
2 uniform sampler2D colorbuffer;
3
4 uniform vec2 layerselection;
5
6 uniform sampler2D cocbuffer;
7
8 /* initial uv coordinate */
9 varying in vec2 uvcoord[];
10 varying out vec2 particlecoord;
11 varying out vec4 color;
12
13
14 #define M_PI 3.1415926535897932384626433832795
15
16 void main(void)
17 {
18         vec4 coc = texture2DLod(cocbuffer, uvcoord[0], 0.0);
19
20         float offset_val = dot(coc.rg, layerselection);
21         if (offset_val < 1.0)
22                 return;
23
24         vec4 colortex = texture2DLod(colorbuffer, uvcoord[0], 0.0);
25
26         /* find the area the pixel will cover and divide the color by it */
27         float alpha = 1.0 / (offset_val * offset_val * M_PI);
28         colortex *= alpha;
29         colortex.a = alpha;
30
31         vec2 offset_far = vec2(offset_val * 0.5) / vec2(rendertargetdim.x, rendertargetdim.y);
32
33         gl_Position = gl_PositionIn[0] + vec4(-offset_far.x, -offset_far.y, 0.0, 0.0);
34         color = colortex;
35         particlecoord = vec2(-1.0, -1.0);
36         EmitVertex();
37         gl_Position = gl_PositionIn[0] + vec4(-offset_far.x, offset_far.y, 0.0, 0.0);
38         particlecoord = vec2(-1.0, 1.0);
39         color = colortex;
40         EmitVertex();
41         gl_Position = gl_PositionIn[0] + vec4(offset_far.x, -offset_far.y, 0.0, 0.0);
42         particlecoord = vec2(1.0, -1.0);
43         color = colortex;
44         EmitVertex();
45         gl_Position = gl_PositionIn[0] + vec4(offset_far.x, offset_far.y, 0.0, 0.0);
46         particlecoord = vec2(1.0, 1.0);
47         color = colortex;
48         EmitVertex();
49         EndPrimitive();
50 }