[Bf-blender-cvs] [d979f1fc628] blender2.8: Workbench: Fix reading and testing from depth buffer

Jeroen Bakker noreply at git.blender.org
Sat May 5 15:33:36 CEST 2018


Commit: d979f1fc628ce9029fc492c7283e9ec302d51508
Author: Jeroen Bakker
Date:   Sat May 5 15:31:10 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBd979f1fc628ce9029fc492c7283e9ec302d51508

Workbench: Fix reading and testing from depth buffer

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

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index e9d9b8c02e8..5b646f8e911 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -1,3 +1,5 @@
+#define NO_OBJECT_ID uint(0)
+
 /* 4x4 bayer matrix prepared for 8bit UNORM precision error. */
 #define P(x) (((x + 0.5) * (1.0 / 16.0) - 0.5) * (1.0 / 255.0))
 const vec4 dither_mat4x4[4] = vec4[4](
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index f93debc8d66..2a17a508046 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -1,6 +1,5 @@
 out vec4 fragColor;
 
-uniform sampler2D depthBuffer;
 uniform usampler2D objectId;
 uniform sampler2D colorBuffer;
 uniform sampler2D normalBuffer;
@@ -17,15 +16,14 @@ void main()
 {
 	ivec2 texel = ivec2(gl_FragCoord.xy);
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
-	float depth = texelFetch(depthBuffer, texel, 0).r;
+	uint object_id = texelFetch(objectId, texel, 0).r;
 
 #ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
-	if (depth == 1.0) {
+	if (object_id == NO_OBJECT_ID) {
 		fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0);
 		return;
 	}
 #else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
-	uint object_id = depth == 1.0? NO_OBJECT_ID: texelFetch(objectId, texel, 0).r;
 	float object_overlap = calculate_object_overlap(objectId, texel, object_id);
 
 	if (object_id == NO_OBJECT_ID) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
index 0c1c430c61b..e1ae9b93144 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_object_overlap_lib.glsl
@@ -1,5 +1,4 @@
 #define OBJECT_OVERLAP_OFFSET 1
-#define NO_OBJECT_ID uint(0)
 
 float calculate_object_overlap(usampler2D objectId, ivec2 texel, uint object_id)
 {
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 73372ce74ce..bb6bc42e8ce 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -72,7 +72,6 @@ extern char datatoc_workbench_world_light_lib_glsl[];
 
 extern DrawEngineType draw_engine_workbench_solid;
 
-#define OBJECT_ID_PASS_ENABLED(wpd) (wpd->drawtype_options & V3D_DRAWOPTION_OBJECT_OVERLAP)
 #define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->drawtype_lighting & V3D_LIGHTING_STUDIO)
 #define SHADOW_ENABLED(wpd) (wpd->drawtype_options & V3D_DRAWOPTION_SHADOW)
 static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
@@ -163,19 +162,14 @@ static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
 }
 
 /* Functions */
-static uint get_material_hash(WORKBENCH_PrivateData *wpd, WORKBENCH_MaterialData *material_template)
+static uint get_material_hash(WORKBENCH_MaterialData *material_template)
 {
 	uint input[4];
 	float *color = material_template->color;
 	input[0] = (uint)(color[0] * 512);
 	input[1] = (uint)(color[1] * 512);
 	input[2] = (uint)(color[2] * 512);
-
-	/* Only hash object id when needed */
-	input[3] = (uint)0;
-	if (OBJECT_ID_PASS_ENABLED(wpd)) {
-		input[3] = material_template->object_id;
-	}
+	input[3] = material_template->object_id;
 
 	return BLI_ghashutil_uinthash_v4_murmur(input);
 }
@@ -277,12 +271,8 @@ void workbench_materials_engine_free()
 
 static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp)
 {
-	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
-	DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
 	DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &e_data.color_buffer_tx);
-	if (OBJECT_ID_PASS_ENABLED(wpd)) {
-		DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
-	}
+	DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
 	if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
 		DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &e_data.normal_buffer_tx);
 	}
@@ -390,7 +380,7 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat
 	get_material_solid_color(wpd, ob, mat, color, hsv_saturation, hsv_value);
 	copy_v3_v3(material_template.color, color);
 	material_template.object_id = engine_object_data->object_id;
-	unsigned int hash = get_material_hash(wpd, &material_template);
+	unsigned int hash = get_material_hash(&material_template);
 
 	material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash));
 	if (material == NULL) {
@@ -509,8 +499,7 @@ void workbench_materials_draw_background(WORKBENCH_Data *vedata)
 	unsigned int clear_stencil = 0xFF;
 
 	GPU_framebuffer_bind(fbl->prepass_fb);
-	int clear_bits = GPU_DEPTH_BIT;
-	SET_FLAG_FROM_TEST(clear_bits, OBJECT_ID_PASS_ENABLED(wpd), GPU_COLOR_BIT);
+	int clear_bits = GPU_DEPTH_BIT | GPU_COLOR_BIT;
 	SET_FLAG_FROM_TEST(clear_bits, SHADOW_ENABLED(wpd), GPU_STENCIL_BIT);
 	GPU_framebuffer_clear(fbl->prepass_fb, clear_bits, clear_color, clear_depth, clear_stencil);
 }



More information about the Bf-blender-cvs mailing list