[Bf-blender-cvs] [74a08cf1285] blender2.8: Eevee: Depth of field: Change final blending.

Clément Foucault noreply at git.blender.org
Sat May 12 23:24:57 CEST 2018


Commit: 74a08cf12854308af166742f7dcaa5c7c227fcd4
Author: Clément Foucault
Date:   Sat May 12 00:52:04 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB74a08cf12854308af166742f7dcaa5c7c227fcd4

Eevee: Depth of field: Change final blending.

This new blending allows background to fill the gaps left by forground
objects. However this has a drawback, background objects that should be
partially occluded in this case can be seen through the blurred objects.

This does not fix the problem of blurred foreground over sharp background.

Also cleanup code to be simpler and remove unused geometry shader.

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_depth_of_field.c
M	source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
D	source/blender/draw/engines/eevee/shaders/effect_dof_geom.glsl
M	source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 5a753ffe159..d3079c337ea 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -169,7 +169,6 @@ data_to_c_simple(engines/eevee/shaders/lit_surface_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lit_surface_vert.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_bloom_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_dof_vert.glsl SRC)
-data_to_c_simple(engines/eevee/shaders/effect_dof_geom.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_dof_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_downsample_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_downsample_cube_frag.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
index 393dbede00f..c17378a48e3 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -62,17 +62,17 @@ static struct {
 } e_data = {NULL}; /* Engine data */
 
 extern char datatoc_effect_dof_vert_glsl[];
-extern char datatoc_effect_dof_geom_glsl[];
 extern char datatoc_effect_dof_frag_glsl[];
 
 static void eevee_create_shader_depth_of_field(void)
 {
-	e_data.dof_downsample_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
-	                                             datatoc_effect_dof_frag_glsl, "#define STEP_DOWNSAMPLE\n");
-	e_data.dof_scatter_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
-	                                          datatoc_effect_dof_frag_glsl, "#define STEP_SCATTER\n");
-	e_data.dof_resolve_sh = DRW_shader_create(datatoc_effect_dof_vert_glsl, NULL,
-	                                          datatoc_effect_dof_frag_glsl, "#define STEP_RESOLVE\n");
+	e_data.dof_downsample_sh = DRW_shader_create_fullscreen(
+	        datatoc_effect_dof_frag_glsl, "#define STEP_DOWNSAMPLE\n");
+	e_data.dof_scatter_sh = DRW_shader_create(
+	        datatoc_effect_dof_vert_glsl, NULL,
+	        datatoc_effect_dof_frag_glsl, "#define STEP_SCATTER\n");
+	e_data.dof_resolve_sh = DRW_shader_create_fullscreen(
+	        datatoc_effect_dof_frag_glsl, "#define STEP_RESOLVE\n");
 }
 
 int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata, Object *camera)
@@ -144,8 +144,6 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 			float focus_dist = BKE_camera_object_dof_distance(camera);
 			float focal_len = cam->lens;
 
-			UNUSED_VARS(rotation, ratio);
-
 			/* this is factor that converts to the scene scale. focal length and sensor are expressed in mm
 			 * unit.scale_length is how many meters per blender unit we have. We want to convert to blender units though
 			 * because the shader reads coordinates in world space, which is in blender units.
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
index 04648f62688..14ddf10f2d8 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
@@ -19,13 +19,6 @@ uniform vec4 bokehParams;
 
 uniform vec2 nearFar; /* Near & far view depths values */
 
-/* initial uv coordinate */
-in vec2 uvcoord;
-
-layout(location = 0) out vec4 fragData0;
-layout(location = 1) out vec4 fragData1;
-layout(location = 2) out vec4 fragData2;
-
 #define M_PI 3.1415926535897932384626433832795
 #define M_2PI 6.2831853071795864769252868
 
@@ -35,23 +28,16 @@ layout(location = 2) out vec4 fragData2;
 float calculate_coc(in float zdepth)
 {
 	float coc = dof_aperturesize * (dof_distance / zdepth - 1.0);
-
-	/* multiply by 1.0 / sensor size to get the normalized size */
-	return coc * dof_invsensorsize;
+	return coc * dof_invsensorsize; /* divide by sensor size to get the normalized size */
 }
 
 vec4 calculate_coc(in vec4 zdepth)
 {
 	vec4 coc = dof_aperturesize * (vec4(dof_distance) / zdepth - vec4(1.0));
-
-	/* multiply by 1.0 / sensor size to get the normalized size */
-	return coc * dof_invsensorsize;
+	return coc * dof_invsensorsize; /* divide by sensor size to get the normalized size */
 }
 
-float max4(vec4 x)
-{
-    return max(max(x.x, x.y), max(x.z, x.w));
-}
+float max4(vec4 x) { return max(max(x.x, x.y), max(x.z, x.w)); }
 
 float linear_depth(float z)
 {
@@ -77,12 +63,16 @@ vec4 linear_depth(vec4 z)
 
 #define THRESHOLD 0.0
 
-/* ----------- Steps ----------- */
+#ifdef STEP_DOWNSAMPLE
+
+layout(location = 0) out vec4 nearColor;
+layout(location = 1) out vec4 farColor;
+layout(location = 2) out vec2 cocData;
 
 /* Downsample the color buffer to half resolution.
  * Weight color samples by
  * Compute maximum CoC for near and far blur. */
-void step_downsample(void)
+void main(void)
 {
 	ivec4 uvs = ivec4(gl_FragCoord.xyxy) * 2 + ivec4(0, 0, 1, 1);
 
@@ -110,39 +100,43 @@ void step_downsample(void)
 	vec4 far_weights = step(THRESHOLD, coc_far);
 
 	/* now write output to weighted buffers. */
-	fragData0 = color1 * near_weights.x +
+	nearColor = color1 * near_weights.x +
 	            color2 * near_weights.y +
 	            color3 * near_weights.z +
 	            color4 * near_weights.w;
 
-	fragData1 = color1 * far_weights.x +
-	            color2 * far_weights.y +
-	            color3 * far_weights.z +
-	            color4 * far_weights.w;
+	farColor = color1 * far_weights.x +
+	           color2 * far_weights.y +
+	           color3 * far_weights.z +
+	           color4 * far_weights.w;
 
 	float norm_near = dot(near_weights, near_weights);
 	float norm_far = dot(far_weights, far_weights);
 
 	if (norm_near > 0.0) {
-		fragData0 /= norm_near;
+		nearColor /= norm_near;
 	}
 
 	if (norm_far > 0.0) {
-		fragData1 /= norm_far;
+		farColor /= norm_far;
 	}
 
 	float max_near_coc = max(max4(coc_near), 0.0);
 	float max_far_coc = max(max4(coc_far), 0.0);
 
-	fragData2 = vec4(max_near_coc, max_far_coc, 0.0, 1.0);
+	cocData = vec2(max_near_coc, max_far_coc);
 }
 
-/* coordinate used for calculating radius et al set in geometry shader */
-in vec2 particlecoord;
+#elif defined(STEP_SCATTER)
+
 flat in vec4 color;
+/* coordinate used for calculating radius */
+in vec2 particlecoord;
+
+out vec4 fragColor;
 
 /* accumulate color in the near/far blur buffers */
-void step_scatter(void)
+void main(void)
 {
 	/* Early out */
 	float dist_sqrd = dot(particlecoord, particlecoord);
@@ -166,17 +160,22 @@ void step_scatter(void)
 		}
 	}
 
-	fragData0 = color;
+	fragColor = color;
 }
 
+#elif defined(STEP_RESOLVE)
+
 #define MERGE_THRESHOLD 4.0
 
 uniform sampler2D farBuffer;
 uniform sampler2D nearBuffer;
 
-vec4 upsample_filter_high(sampler2D tex, vec2 uv, vec2 texelSize)
+in vec4 uvcoordsvar;
+out vec4 fragColor;
+
+vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
 {
-	/* 9-tap bilinear upsampler (tent filter) */
+#if 1 /* 9-tap bilinear upsampler (tent filter) */
 	vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0);
 
 	vec4 s;
@@ -193,10 +192,7 @@ vec4 upsample_filter_high(sampler2D tex, vec2 uv, vec2 texelSize)
 	s += textureLod(tex, uv + d.xy, 0.0);
 
 	return s * (1.0 / 16.0);
-}
-
-vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
-{
+#else
 	/* 4-tap bilinear upsampler */
 	vec4 d = texelSize.xyxy * vec4(-1, -1, +1, +1) * 0.5;
 
@@ -207,55 +203,36 @@ vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
 	s += textureLod(tex, uv + d.zw, 0.0);
 
 	return s * (1.0 / 4.0);
+#endif
 }
 
 /* Combine the Far and Near color buffers */
-void step_resolve(void)
+void main(void)
 {
-	/* Recompute Near / Far CoC */
-	float depth = textureLod(depthBuffer, uvcoord, 0.0).r;
+	/* Recompute Near / Far CoC per pixel */
+	float depth = textureLod(depthBuffer, uvcoordsvar.xy, 0.0).r;
 	float zdepth = linear_depth(depth);
 	float coc_signed = calculate_coc(zdepth);
 	float coc_far = max(-coc_signed, 0.0);
 	float coc_near = max(coc_signed, 0.0);
 
-	/* Recompute Near / Far CoC */
 	vec2 texelSize = 1.0 / vec2(textureSize(farBuffer, 0));
-	vec4 srccolor = textureLod(colorBuffer, uvcoord, 0.0);
-	vec4 farcolor = upsample_filter_high(farBuffer, uvcoord, texelSize);
-	vec4 nearcolor = upsample_filter_high(nearBuffer, uvcoord, texelSize);
+	vec4 srccolor = textureLod(colorBuffer, uvcoordsvar.xy, 0.0);
+	vec4 farcolor = upsample_filter(farBuffer, uvcoordsvar.xy, texelSize);
+	vec4 nearcolor = upsample_filter(nearBuffer, uvcoordsvar.xy, texelSize);
 
 	float farweight = farcolor.a;
-	if (farweight > 0.0)
-		farcolor /= farweight;
-
-	float mixfac = smoothstep(1.0, MERGE_THRESHOLD, coc_far);
+	float nearweight = nearcolor.a;
 
-	farweight = mix(1.0, farweight, mixfac);
+	if (farcolor.a > 0.0) farcolor /= farcolor.a;
+	if (nearcolor.a > 0.0) nearcolor /= nearcolor.a;
 
-	float nearweight = nearcolor.a;
-	if (nearweight > 0.0) {
-		nearcolor /= nearweight;
-	}
+	float mixfac = smoothstep(1.0, MERGE_THRESHOLD, abs(coc_signed));
 
-	if (coc_near > 1.0) {
-		mixfac = smoothstep(1.0, MERGE_THRESHOLD, coc_near);
-		fragData0 = mix(srccolor, nearcolor, mixfac);
-	}
-	else {
-		float totalweight = nearweight + farweight;
-		vec4 finalcolor = mix(srccolor, farcolor, mixfac);
-		fragData0 = mix(finalcolor, nearcolor, nearweight / totalweight);
-	}
+	float totalweight = nearweight + farweight;
+	farcolor = mix(srccolor, farcolor, mixfac);
+	nearcolor = mix(srccolor, nearcolor, mixfac);
+	fragColor = mix(farcolor, nearcolor, nearweight / max(1e-6, totalweight));
 }
 
-void main()
-{
-#ifdef STEP_DOWNSAMPLE
-	step_downsample();
-#elif defined(STEP_SCATTER)
-	step_scatter();
-#elif defined(STEP_RESOLVE)
-	step_resolve();
 #endif
-}
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_geom.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_geom.glsl
deleted file mode 100644
index 1c774885a32..00000000000
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_geom.glsl
+++ /dev/null
@@ -1,55 +0,0 @@
-uniform ivec2 targetBufferSize;
-
-uniform vec2 layerSelection;
-
-uniform sampler2D colorBuffer;
-uniform sampler2D cocBuffer;
-
-layout(points) in;
-layout(triangle_strip, max_vertices = 4) out;
-
-#define 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list