[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