[Bf-blender-cvs] [7798ecd] viewport_experiments: Add another level of small blur to bridge between no/medium blurring.
Antony Riakiotakis
noreply at git.blender.org
Mon Nov 3 14:07:14 CET 2014
Commit: 7798ecd74338c2549835f3ee4ad3220f423a5a50
Author: Antony Riakiotakis
Date: Mon Nov 3 14:06:47 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB7798ecd74338c2549835f3ee4ad3220f423a5a50
Add another level of small blur to bridge between no/medium blurring.
Algorithm used is now a full implementation of
"Practical Post-Process depth of field", presented here [1],
with a few modifications as to how circle of confusion is
applied at the final pass.
[1] http://http.developer.nvidia.com/GPUGems3/gpugems3_ch28.html
===================================================================
M source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
M source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl
===================================================================
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
index ad4d666..385d18d 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl
@@ -58,8 +58,8 @@ void first_pass()
/* amount to add to uvs so that they move one row further */
vec2 offset_row[3];
offset_row[0] = vec2(0.0, invrendertargetdim.y);
- offset_row[1] = 2 * offset_row[0];
- offset_row[2] = 3 * offset_row[0];
+ offset_row[1] = 2.0 * offset_row[0];
+ offset_row[2] = 3.0 * offset_row[0];
/* heavily blur the image */
vec4 color = texture2D(colorbuffer, color_uv1);
@@ -140,7 +140,21 @@ void fourth_pass()
color += texture2D(colorbuffer, uvcoordsvar.xw);
color += texture2D(colorbuffer, uvcoordsvar.yw);
- gl_FragColor = color/4.0;
+ gl_FragColor = color / 4.0;
+}
+
+vec4 small_sample_blur(in sampler2D colorbuffer, in vec2 uv, in vec4 color)
+{
+ float weight = 1.0/ 17.0;
+ vec4 result = weight * color;
+ weight *= 4.0;
+
+ result += weight * texture2D(colorbuffer, uv + color_uv1.xy);
+ result += weight * texture2D(colorbuffer, uv - color_uv1.xy);
+ result += weight * texture2D(colorbuffer, uv + color_uv2.yx);
+ result += weight * texture2D(colorbuffer, uv - color_uv2.yx);
+
+ return result;
}
@@ -151,6 +165,7 @@ void fifth_pass()
vec4 color_orig = texture2D(colorbuffer, uvcoordsvar.xy);
vec4 highblurred = texture2D(blurredcolorbuffer, uvcoordsvar.xy);
vec4 mediumblurred = texture2D(mblurredcolorbuffer, uvcoordsvar.xy);
+ vec4 smallblurred = small_sample_blur(colorbuffer, uvcoordsvar.xy, color_orig);
float depth = texture2D(depthbuffer, uvcoordsvar.xy).r;
float zdepth = get_view_space_z_from_depth(vec4(viewvecs[0].z), vec4(viewvecs[1].z), vec4(depth)).r;
@@ -159,13 +174,17 @@ void fifth_pass()
/* calculate final coc here */
float coc = max(max(coc_far, mediumblurred.a), 0.0);
- factors.x = 1.0 - clamp(2.0 * coc, 0.0, 1.0);
- factors.y = 1.0 - clamp(abs(2.0 * (coc - 0.5)), 0.0, 1.0);
- factors.z = clamp(5.0 * (coc - 0.5), 0.0, 1.0);
+ float width = 2.5;
+ float radius = 0.2;
+
+ factors.x = 1.0 - clamp(width * coc, 0.0, 1.0);
+ factors.y = 1.0 - clamp(abs(width * (coc - 2.0 * radius)), 0.0, 1.0);
+ factors.z = 1.0 - clamp(abs(width * (coc - 3.0 * radius)), 0.0, 1.0);
+ factors.w = 1.0 - clamp(abs(width * (coc - 4.0 * radius)), 0.0, 1.0);
/* blend! */
- vec4 color = factors.x * color_orig + factors.y * mediumblurred + factors.z * highblurred;
+ vec4 color = factors.x * color_orig + factors.y * smallblurred + factors.z * mediumblurred + factors.w * highblurred;
- color /= (factors.x + factors.y + factors.z);
+ color /= dot(factors, vec4(1.0));
gl_FragColor = vec4(color.rgb, 1.0);
}
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl b/source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl
index 62063ba..61055c7 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl
@@ -42,12 +42,23 @@ void vert_dof_fourth_pass()
gl_Position = gl_Vertex;
}
+void vert_dof_fifth_pass()
+{
+ vec4 halfpixel = vec4(-0.5, 0.5, -0.5, 0.5);
+ color_uv1 = vec2(0.5, 1.5) * invrendertargetdim;
+
+ uvcoordsvar = gl_MultiTexCoord0;
+ gl_Position = gl_Vertex;
+}
+
void main()
{
#ifdef FIRST_PASS
vert_dof_first_pass();
#elif defined(FOURTH_PASS)
vert_dof_fourth_pass();
+#elif defined(FIFTH_PASS)
+ vert_dof_fifth_pass();
#else
vert_generic();
#endif
More information about the Bf-blender-cvs
mailing list