[Bf-blender-cvs] [d25ec499d89] blender2.8: Eevee: Depht Of Field: Merge Scatter passes together.

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


Commit: d25ec499d89daf200c37ed547c50b1706d1b3557
Author: Clément Foucault
Date:   Sat May 12 21:01:07 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd25ec499d89daf200c37ed547c50b1706d1b3557

Eevee: Depht Of Field: Merge Scatter passes together.

This means only one texture to draw to and only one sprite per pixel.

The texture is twice as large and near and far planes are side by side.

The sprite choose the biggest coc to expand to and is redirected to the
area (layer) it belongs to.

The fragment shader discard every pixel that does not belong to the correct
layer.

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

M	source/blender/draw/engines/eevee/eevee_depth_of_field.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl

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

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 f4d534c4ccc..1ba9b5f9de4 100644
--- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c
+++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c
@@ -120,18 +120,11 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 			/* Go full 32bits for rendering and reduce the color artifacts. */
 			GPUTextureFormat fb_format = DRW_state_is_image_render() ? GPU_RGBA32F : GPU_RGBA16F;
 
-			effects->dof_far_blur = DRW_texture_pool_query_2D(buffer_size[0], buffer_size[1], fb_format,
-			                                                  &draw_engine_eevee_type);
-			GPU_framebuffer_ensure_config(&fbl->dof_scatter_far_fb, {
+			effects->dof_blur = DRW_texture_pool_query_2D(buffer_size[0] * 2, buffer_size[1], fb_format,
+			                                              &draw_engine_eevee_type);
+			GPU_framebuffer_ensure_config(&fbl->dof_scatter_fb, {
 				GPU_ATTACHMENT_NONE,
-				GPU_ATTACHMENT_TEXTURE(effects->dof_far_blur),
-			});
-
-			effects->dof_near_blur = DRW_texture_pool_query_2D(buffer_size[0], buffer_size[1], fb_format,
-			                                                   &draw_engine_eevee_type);
-			GPU_framebuffer_ensure_config(&fbl->dof_scatter_near_fb, {
-				GPU_ATTACHMENT_NONE,
-				GPU_ATTACHMENT_TEXTURE(effects->dof_near_blur),
+				GPU_ATTACHMENT_TEXTURE(effects->dof_blur),
 			});
 
 			/* Parameters */
@@ -178,8 +171,7 @@ int EEVEE_depth_of_field_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 
 	/* Cleanup to release memory */
 	GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_down_fb);
-	GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_far_fb);
-	GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_near_fb);
+	GPU_FRAMEBUFFER_FREE_SAFE(fbl->dof_scatter_fb);
 
 	return 0;
 }
@@ -221,17 +213,16 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_
 		const int sprite_ct = ((int)viewport_size[0] / 2) * ((int)viewport_size[1] / 2); /* brackets matters */
 		grp = DRW_shgroup_empty_tri_batch_create(e_data.dof_scatter_sh, psl->dof_scatter, sprite_ct);
 
-		DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->unf_source_buffer);
+		DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_down_near);
+		DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_down_far);
 		DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc);
-		DRW_shgroup_uniform_vec2(grp, "layerSelection", effects->dof_layer_select, 1);
 		DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2);
 
 		psl->dof_resolve = DRW_pass_create("DoF Resolve", DRW_STATE_WRITE_COLOR);
 
 		grp = DRW_shgroup_create(e_data.dof_resolve_sh, psl->dof_resolve);
+		DRW_shgroup_uniform_texture_ref(grp, "scatterBuffer", &effects->dof_blur);
 		DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &effects->source_buffer);
-		DRW_shgroup_uniform_texture_ref(grp, "nearBuffer", &effects->dof_near_blur);
-		DRW_shgroup_uniform_texture_ref(grp, "farBuffer", &effects->dof_far_blur);
 		DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
 		DRW_shgroup_uniform_vec2(grp, "nearFar", effects->dof_near_far, 1);
 		DRW_shgroup_uniform_vec3(grp, "dofParams", effects->dof_params, 1);
@@ -255,18 +246,9 @@ void EEVEE_depth_of_field_draw(EEVEE_Data *vedata)
 		GPU_framebuffer_bind(fbl->dof_down_fb);
 		DRW_draw_pass(psl->dof_down);
 
-		/* Scatter Far */
-		effects->unf_source_buffer = effects->dof_down_far;
-		copy_v2_fl2(effects->dof_layer_select, 0.0f, 1.0f);
-		GPU_framebuffer_bind(fbl->dof_scatter_far_fb);
-		GPU_framebuffer_clear_color(fbl->dof_scatter_far_fb, clear_col);
-		DRW_draw_pass(psl->dof_scatter);
-
-		/* Scatter Near */
-		effects->unf_source_buffer = effects->dof_down_near;
-		copy_v2_fl2(effects->dof_layer_select, 1.0f, 0.0f);
-		GPU_framebuffer_bind(fbl->dof_scatter_near_fb);
-		GPU_framebuffer_clear_color(fbl->dof_scatter_near_fb, clear_col);
+		/* Scatter */
+		GPU_framebuffer_bind(fbl->dof_scatter_fb);
+		GPU_framebuffer_clear_color(fbl->dof_scatter_fb, clear_col);
 		DRW_draw_pass(psl->dof_scatter);
 
 		/* Resolve */
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index d76ecea4e43..42b3d8caf98 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -227,8 +227,7 @@ typedef struct EEVEE_FramebufferList {
 	struct GPUFrameBuffer *sss_clear_fb;
 	struct GPUFrameBuffer *sss_accum_fb;
 	struct GPUFrameBuffer *dof_down_fb;
-	struct GPUFrameBuffer *dof_scatter_far_fb;
-	struct GPUFrameBuffer *dof_scatter_near_fb;
+	struct GPUFrameBuffer *dof_scatter_fb;
 	struct GPUFrameBuffer *volumetric_fb;
 	struct GPUFrameBuffer *volumetric_scat_fb;
 	struct GPUFrameBuffer *volumetric_integ_fb;
@@ -547,13 +546,11 @@ typedef struct EEVEE_EffectsInfo {
 	float dof_params[3];
 	float dof_bokeh[4];
 	float dof_bokeh_sides[4];
-	float dof_layer_select[2];
 	int dof_target_size[2];
 	struct GPUTexture *dof_down_near; /* Textures from pool */
 	struct GPUTexture *dof_down_far;
 	struct GPUTexture *dof_coc;
-	struct GPUTexture *dof_near_blur;
-	struct GPUTexture *dof_far_blur;
+	struct GPUTexture *dof_blur;
 	/* Other */
 	float prev_persmat[4][4];
 	/* Bloom */
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 47a2965293c..34d92fab2c2 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl
@@ -91,6 +91,7 @@ void main(void)
 
 flat in vec4 color;
 flat in float smoothFac;
+flat in ivec2 edge;
 /* coordinate used for calculating radius */
 in vec2 particlecoord;
 
@@ -99,15 +100,16 @@ out vec4 fragColor;
 /* accumulate color in the near/far blur buffers */
 void main(void)
 {
-	/* Early out */
-	float dist_sqr = dot(particlecoord, particlecoord);
+	/* Discard to avoid bleeding onto the next layer */
+	if (int(gl_FragCoord.x) * edge.x + edge.y > 0)
+		discard;
 
 	/* Circle Dof */
-	if (dist_sqr > 1.0) {
-		discard;
-	}
+	float dist = length(particlecoord);
 
-	float dist = sqrt(dist_sqr);
+	/* Ouside of bokeh shape */
+	if (dist > 1.0)
+		discard;
 
 	/* Regular Polygon Dof */
 	if (bokeh_sides.x > 0.0) {
@@ -118,15 +120,15 @@ void main(void)
 		 * float denom = theta - (M_2PI / bokeh_sides) * floor((bokeh_sides * theta + M_PI) / M_2PI);
 		 * float r = cos(M_PI / bokeh_sides) / cos(denom); */
 		float denom = theta - bokeh_sides.y * floor(bokeh_sides.z * theta + 0.5);
-		float r = bokeh_sides.w / max(1e-8, cos(denom));
+		float r = bokeh_sides.w / cos(denom);
 
 		/* Divide circle radial coord by the shape radius for angle theta.
 		 * Giving us the new linear radius to the shape edge. */
 		dist /= r;
 
-		if (dist > 1.0) {
+		/* Ouside of bokeh shape */
+		if (dist > 1.0)
 			discard;
-		}
 	}
 
 	fragColor = color;
@@ -142,14 +144,17 @@ void main(void)
 
 #define MERGE_THRESHOLD 4.0
 
-uniform sampler2D farBuffer;
-uniform sampler2D nearBuffer;
+uniform sampler2D scatterBuffer;
 
 in vec4 uvcoordsvar;
 out vec4 fragColor;
 
 vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
 {
+	/* TODO FIXME: Clamp the sample position
+	 * depending on the layer to avoid bleeding.
+	 * This is not really noticeable so leaving it as is for now. */
+
 #if 1 /* 9-tap bilinear upsampler (tent filter) */
 	vec4 d = texelSize.xyxy * vec4(1, 1, -1, 0);
 
@@ -184,17 +189,21 @@ vec4 upsample_filter(sampler2D tex, vec2 uv, vec2 texelSize)
 /* Combine the Far and Near color buffers */
 void main(void)
 {
+	vec2 uv = uvcoordsvar.xy;
 	/* Recompute Near / Far CoC per pixel */
-	float depth = textureLod(depthBuffer, uvcoordsvar.xy, 0.0).r;
+	float depth = textureLod(depthBuffer, uv, 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);
 
-	vec2 texelSize = 1.0 / vec2(textureSize(farBuffer, 0));
-	vec4 srccolor = textureLod(colorBuffer, uvcoordsvar.xy, 0.0);
-	vec4 farcolor = upsample_filter(farBuffer, uvcoordsvar.xy, texelSize);
-	vec4 nearcolor = upsample_filter(nearBuffer, uvcoordsvar.xy, texelSize);
+	vec2 texelSize = vec2(0.5, 1.0) / vec2(textureSize(scatterBuffer, 0));
+	vec4 srccolor = textureLod(colorBuffer, uv, 0.0);
+
+	vec2 near_uv = uv * vec2(0.5, 1.0);
+	vec2 far_uv = near_uv + vec2(0.5, 0.0);
+	vec4 farcolor = upsample_filter(scatterBuffer, far_uv, texelSize);
+	vec4 nearcolor = upsample_filter(scatterBuffer, near_uv, texelSize);
 
 	float farweight = farcolor.a;
 	float nearweight = nearcolor.a;
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
index e28c957d58d..338003b92cd 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_vert.glsl
@@ -1,17 +1,17 @@
 
-uniform vec2 layerSelection;
-
 uniform vec4 bokehParams[2];
 
 #define bokeh_rotation      bokehParams[0].x
 #define bokeh_ratio         bokehParams[0].y
 #define bokeh_maxsize       bokehParams[0].z
 
+uniform sampler2D nearBuffer;
+uniform sampler2D farBuffer;
 uniform sampler2D cocBuffer;
-uniform sampler2D colorBuffer;
 
 flat out vec4 color;
 flat out float smoothFac;
+flat out ivec2 edge;
 out vec2 particlecoord;
 
 #define M_PI 3.1415926535897932384626433832795
@@ -20,7 +20,9 @@ out vec2 particlecoord;
 void main()
 {
 	ivec2 tex_size = textureSize(cocBuffer, 0);
-	vec2 texel_size = 1.0 / vec2(tex_size);
+	/* We render to a double width texture so compute
+	 * the target texel size accordingly */
+	vec2 texel_size = vec2(0.5, 1.0) / vec2(tex_size);
 
 	int t_id = gl_VertexID / 3; /* Triangle Id */
 
@@ -30,16 +32,22 @@ void main()
 	texelco.y = t_id / tex_size.x;
 
 	vec2 cocs = texelFetch(cocBuffer, texelco, 0).rg;
-	float coc = dot(layerSelection, cocs);
+
+	bool is_near = (cocs.x > cocs.y);
+	float coc = (is_near) ? cocs.x : cocs.y;
 
 	/* Clamp to max size for performance */
 	coc = min(coc, bokeh

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list