[Bf-blender-cvs] [223c1a107a9] blender2.8: Workbench: Make object ID pass optionnal

Clément Foucault noreply at git.blender.org
Mon Dec 3 17:19:26 CET 2018


Commit: 223c1a107a92705d4516f181b3dbdec3937fbbf3
Author: Clément Foucault
Date:   Mon Dec 3 02:42:23 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB223c1a107a92705d4516f181b3dbdec3937fbbf3

Workbench: Make object ID pass optionnal

We separate the background and foreground shading passes to be able to make
the object id pass optionnal if we don't need it.

This saves a bit more memory. Also not clearing all rendertargets saves
some GPU time too.

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

M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 70dfa589cdc..c3afb6b307e 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -224,6 +224,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_checkerboard_depth_frag.gls
 data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_deferred_background_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_taa_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
new file mode 100644
index 00000000000..9e4394238ff
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
@@ -0,0 +1,39 @@
+
+uniform usampler2D objectId;
+
+uniform vec2 invertedViewportSize;
+
+out vec4 fragColor;
+
+layout(std140) uniform world_block {
+	WorldData world_data;
+};
+
+void main()
+{
+	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
+	vec3 background = background_color(world_data, uv_viewport.y);
+
+#ifndef V3D_SHADING_OBJECT_OUTLINE
+
+	fragColor = vec4(background, world_data.background_alpha);
+
+#else /* !V3D_SHADING_OBJECT_OUTLINE */
+
+	ivec2 texel = ivec2(gl_FragCoord.xy);
+	uint object_id = texelFetch(objectId, texel, 0).r;
+	float object_outline = calculate_object_outline(objectId, texel, object_id);
+
+	if (object_outline == 0.0) {
+		fragColor = vec4(background, world_data.background_alpha);
+	}
+	else {
+		/* Do correct alpha blending. */
+		vec4 background_color = vec4(background, 1.0) * world_data.background_alpha;
+		vec4 outline_color = vec4(world_data.object_outline_color.rgb, 1.0);
+		fragColor = mix(outline_color, background_color, object_outline);
+		fragColor = vec4(fragColor.rgb / max(1e-8, fragColor.a), fragColor.a);
+	}
+
+#endif /* !V3D_SHADING_OBJECT_OUTLINE */
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 96537c47f11..6d2af8557d0 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -26,32 +26,6 @@ void main()
 {
 	ivec2 texel = ivec2(gl_FragCoord.xy);
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
-	uint object_id = texelFetch(objectId, texel, 0).r;
-
-	/* TODO separate this into its own shader. */
-#ifndef V3D_SHADING_OBJECT_OUTLINE
-	if (object_id == NO_OBJECT_ID) {
-		fragColor = vec4(background_color(world_data, uv_viewport.y), world_data.background_alpha);
-		return;
-	}
-#else /* !V3D_SHADING_OBJECT_OUTLINE */
-	float object_outline = calculate_object_outline(objectId, texel, object_id);
-
-	if (object_id == NO_OBJECT_ID) {
-		vec3 background = background_color(world_data, uv_viewport.y);
-		if (object_outline == 0.0) {
-			fragColor = vec4(background, world_data.background_alpha);
-		}
-		else {
-			/* Do correct alpha blending. */
-			vec4 background_color = vec4(background, 1.0) * world_data.background_alpha;
-			vec4 outline_color = vec4(world_data.object_outline_color.rgb, 1.0);
-			fragColor = mix(outline_color, background_color, object_outline);
-			fragColor = vec4(fragColor.rgb / max(1e-8, fragColor.a), fragColor.a);
-		}
-		return;
-	}
-#endif /* !V3D_SHADING_OBJECT_OUTLINE */
 
 	vec4 base_color = texelFetch(colorBuffer, texel, 0);
 
@@ -105,6 +79,8 @@ void main()
 #endif
 
 #ifdef V3D_SHADING_OBJECT_OUTLINE
+	uint object_id = texelFetch(objectId, texel, 0).r;
+	float object_outline = calculate_object_outline(objectId, texel, object_id);
 	shaded_color = mix(world_data.object_outline_color.rgb, shaded_color, object_outline);
 #endif
 
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 957f5b99614..c3eb3d82810 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -31,6 +31,7 @@
 #include "BLI_dynstr.h"
 #include "BLI_utildefines.h"
 #include "BLI_rand.h"
+#include "BLI_string_utils.h"
 
 #include "BKE_node.h"
 #include "BKE_modifier.h"
@@ -60,6 +61,7 @@ static struct {
 	struct GPUShader *prepass_sh_cache[MAX_SHADERS];
 	struct GPUShader *composite_sh_cache[MAX_SHADERS];
 	struct GPUShader *cavity_sh[MAX_CAVITY_SHADERS];
+	struct GPUShader *background_sh[2];
 	struct GPUShader *ghost_resolve_sh;
 	struct GPUShader *shadow_fail_sh;
 	struct GPUShader *shadow_fail_manifold_sh;
@@ -91,6 +93,7 @@ extern char datatoc_workbench_prepass_vert_glsl[];
 extern char datatoc_workbench_prepass_frag_glsl[];
 extern char datatoc_workbench_cavity_frag_glsl[];
 extern char datatoc_workbench_deferred_composite_frag_glsl[];
+extern char datatoc_workbench_deferred_background_frag_glsl[];
 extern char datatoc_workbench_ghost_resolve_frag_glsl[];
 
 extern char datatoc_workbench_shadow_vert_glsl[];
@@ -118,10 +121,10 @@ static char *workbench_build_composite_frag(WORKBENCH_PrivateData *wpd)
 	BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
 	BLI_dynstr_append(ds, datatoc_workbench_background_lib_glsl);
 
-	if ((wpd->shading.light & V3D_LIGHTING_MATCAP) || (wpd->shading.light & V3D_LIGHTING_STUDIO) || (wpd->shading.flag & V3D_SHADING_SPECULAR_HIGHLIGHT)) {
+	if (!FLAT_ENABLED(wpd)) {
 		BLI_dynstr_append(ds, datatoc_workbench_world_light_lib_glsl);
 	}
-	if (wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE) {
+	if (OBJECT_OUTLINE_ENABLED(wpd)) {
 		BLI_dynstr_append(ds, datatoc_workbench_object_outline_lib_glsl);
 	}
 	if (CURVATURE_ENABLED(wpd)) {
@@ -182,6 +185,9 @@ static char *workbench_build_cavity_frag(bool cavity, bool curvature, bool high_
 	if (high_dpi) {
 		BLI_dynstr_append(ds, "#define CURVATURE_OFFSET 2\n");
 	}
+	if (NORMAL_ENCODING_ENABLED()) {
+		BLI_dynstr_append(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
+	}
 	BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
 	BLI_dynstr_append(ds, datatoc_workbench_curvature_lib_glsl);
 	BLI_dynstr_append(ds, datatoc_workbench_cavity_frag_glsl);
@@ -229,8 +235,24 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool
 	}
 }
 
+static void ensure_background_shaders(const bool use_outline)
+{
+	if (e_data.background_sh[use_outline] == NULL) {
+		const char *defines = (use_outline) ? "#define V3D_SHADING_OBJECT_OUTLINE\n" : NULL;
+		char *frag = BLI_string_joinN(
+		        datatoc_workbench_data_lib_glsl,
+		        datatoc_workbench_common_lib_glsl,
+		        datatoc_workbench_background_lib_glsl,
+		        datatoc_workbench_object_outline_lib_glsl,
+		        datatoc_workbench_deferred_background_frag_glsl);
+		e_data.background_sh[use_outline] = DRW_shader_create_fullscreen(frag, defines);
+		MEM_freeN(frag);
+	}
+}
+
 static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
 {
+	const bool use_outline = OBJECT_OUTLINE_ENABLED(wpd);
 	int index_solid = workbench_material_get_shader_index(wpd, false, false);
 	int index_solid_hair = workbench_material_get_shader_index(wpd, false, true);
 	int index_texture = workbench_material_get_shader_index(wpd, true, false);
@@ -240,12 +262,14 @@ static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
 	ensure_deferred_shaders(wpd, index_solid_hair, false, true);
 	ensure_deferred_shaders(wpd, index_texture, true, false);
 	ensure_deferred_shaders(wpd, index_texture_hair, true, true);
+	ensure_background_shaders(use_outline);
 
 	wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid];
 	wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair];
 	wpd->prepass_texture_sh = e_data.prepass_sh_cache[index_texture];
 	wpd->prepass_texture_hair_sh = e_data.prepass_sh_cache[index_texture_hair];
 	wpd->composite_sh = e_data.composite_sh_cache[index_solid];
+	wpd->background_sh = e_data.background_sh[use_outline];
 }
 
 
@@ -377,7 +401,6 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 	{
 		const float *viewport_size = DRW_viewport_size_get();
 		const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
-		const GPUTextureFormat id_tex_format = OBJECT_ID_PASS_ENABLED(wpd) ? GPU_R32UI : GPU_R8UI;
 		const GPUTextureFormat nor_tex_format = NORMAL_ENCODING_ENABLED() ? GPU_RG16 : GPU_RGBA32F;
 		const GPUTextureFormat comp_tex_format = DRW_state_is_image_render() ? GPU_RGBA16F : GPU_R11F_G11F_B10F;
 
@@ -388,9 +411,11 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 		e_data.cavity_buffer_tx = NULL;
 		e_data.metallic_buffer_tx = NULL;
 
-		e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], id_tex_format, &draw_engine_workbench_solid);
 		e_data.color_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_RGBA8, &draw_engine_workbench_solid);
 		e_data.composite_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], comp_tex_format, &draw_engine_workbench_solid);
+		if (OBJECT_ID_PASS_ENABLED(wpd)) {
+			e_data.object_id_tx = DRW_texture_pool_query_2D(size[0], size[1], GPU_R32UI, &draw_engine_workbench_solid);
+		}
 		if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
 			e_data.normal_buffer_tx = DRW_texture_pool_query_2D(size[0], size[1], nor_tex_format, &draw_engine_workbench_solid);
 		}
@@ -424,6 +449,13 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 			GPU_ATTACHMENT_NONE,
 			GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
 		});
+
+		if (OBJECT_ID_PASS_ENABLED(wpd)) {
+			GPU_framebuffer_ensure_config(&fbl->id_clear_fb, {
+				GPU_ATTACHMENT_NONE,
+				GPU_ATTACHMENT_TEXTURE(e_data.object_id_tx),
+			});
+		}
 	}
 
 	{
@@ -480,7 +512,6 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 
 		i

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list