[Bf-blender-cvs] [8134f3f0a6b] master: Workbench: Add "Shadow" factor to Xray

Clément Foucault noreply at git.blender.org
Tue Jan 29 15:17:10 CET 2019


Commit: 8134f3f0a6bb0ca7bb6c002a7ce0b4c91342a6d1
Author: Clément Foucault
Date:   Tue Jan 29 03:46:57 2019 +0100
Branches: master
https://developer.blender.org/rB8134f3f0a6bb0ca7bb6c002a7ce0b4c91342a6d1

Workbench: Add "Shadow" factor to Xray

This just maintain more parity accross the 2 visuals. Note that this is not
"real shadowing" just the facing factor shadowing.

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

M	source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index 93da32dd765..b3642b7beb3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -14,6 +14,11 @@ uniform vec3 materialDiffuseColor;
 uniform vec3 materialSpecularColor;
 uniform float materialRoughness;
 
+uniform float shadowMultiplier = 0.5;
+uniform float lightMultiplier = 1.0;
+uniform float shadowShift = 0.1;
+uniform float shadowFocus = 1.0;
+
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 normal_viewport;
 #endif /* NORMAL_VIEWPORT_PASS_ENABLED */
@@ -67,6 +72,12 @@ void main()
 	                                       nor, I_vs);
 #endif
 
+#ifdef V3D_SHADING_SHADOW
+	float light_factor = -dot(nor, world_data.shadow_direction_vs.xyz);
+	float shadow_mix = smoothstep(shadowFocus, shadowShift, light_factor);
+	shaded_color *= mix(lightMultiplier, shadowMultiplier, shadow_mix);
+#endif
+
 	/* Based on :
 	 * McGuire and Bavoil, Weighted Blended Order-Independent Transparency, Journal of
 	 * Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122–141, 2013
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index b009a8acb08..97b585c1215 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -76,6 +76,12 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 		        wpd->shading.studio_light, STUDIOLIGHT_TYPE_STUDIO);
 	}
 
+
+	float shadow_focus = scene->display.shadow_focus;
+	/* Clamp to avoid overshadowing and shading errors. */
+	CLAMP(shadow_focus, 0.0001f, 0.99999f);
+	wpd->shadow_shift = scene->display.shadow_shift;
+	wpd->shadow_focus = 1.0f - shadow_focus * (1.0f - wpd->shadow_shift);
 	wpd->shadow_multiplier = 1.0 - wpd->shading.shadow_intensity;
 
 	WORKBENCH_UBO_World *wd = &wpd->world_data;
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 6f97c9df74d..c1b4398c3d2 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -699,11 +699,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
 		workbench_private_data_get_light_direction(wpd, e_data.display.light_direction);
 		studiolight_update_light(wpd, e_data.display.light_direction);
 
-		float shadow_focus = scene->display.shadow_focus;
-		/* Clamp to avoid overshadowing and shading errors. */
-		CLAMP(shadow_focus, 0.0001f, 0.99999f);
-		shadow_focus = 1.0f - shadow_focus * (1.0f - scene->display.shadow_shift);
-
 		if (SHADOW_ENABLED(wpd)) {
 			psl->composite_pass = DRW_pass_create(
 			        "Composite", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL | DRW_STATE_DEPTH_GREATER);
@@ -713,7 +708,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
 			DRW_shgroup_uniform_float_copy(grp, "lightMultiplier", 1.0f);
 			DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1);
 			DRW_shgroup_uniform_float_copy(grp, "shadowShift", scene->display.shadow_shift);
-			DRW_shgroup_uniform_float_copy(grp, "shadowFocus", shadow_focus);
+			DRW_shgroup_uniform_float_copy(grp, "shadowFocus", wpd->shadow_focus);
 			DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
 
 			/* Stencil Shadow passes. */
@@ -753,7 +748,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
 			DRW_shgroup_uniform_float(grp, "lightMultiplier", &wpd->shadow_multiplier, 1);
 			DRW_shgroup_uniform_float(grp, "shadowMultiplier", &wpd->shadow_multiplier, 1);
 			DRW_shgroup_uniform_float_copy(grp, "shadowShift", scene->display.shadow_shift);
-			DRW_shgroup_uniform_float_copy(grp, "shadowFocus", shadow_focus);
+			DRW_shgroup_uniform_float_copy(grp, "shadowFocus", wpd->shadow_focus);
 			DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
 #endif
 		}
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index a3643c7f118..413ab367d83 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -182,6 +182,11 @@ WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(
 		if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) {
 			DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
 		}
+		if (SHADOW_ENABLED(wpd)) {
+			DRW_shgroup_uniform_float_copy(grp, "shadowMultiplier", wpd->shadow_multiplier);
+			DRW_shgroup_uniform_float_copy(grp, "shadowShift", wpd->shadow_shift);
+			DRW_shgroup_uniform_float_copy(grp, "shadowFocus", wpd->shadow_focus);
+		}
 
 		workbench_material_shgroup_uniform(wpd, grp, material, ob, false, false, interp);
 		material->shgrp = grp;
@@ -212,7 +217,6 @@ WORKBENCH_MaterialData *workbench_forward_get_or_create_material_data(
 static GPUShader *ensure_forward_accum_shaders(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
 {
 	int index = workbench_material_get_accum_shader_index(wpd, use_textures, is_hair);
-	BLI_assert(index < MAX_ACCUM_SHADERS);
 	if (e_data.transparent_accum_sh_cache[index] == NULL) {
 		char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
 		char *transparent_accum_vert = workbench_build_forward_vert(is_hair);
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 3c02810f176..a2e57cd6c7d 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -179,6 +179,7 @@ int workbench_material_get_composite_shader_index(WORKBENCH_PrivateData *wpd)
 	SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_CAVITY, 1 << 3);
 	SET_FLAG_FROM_TEST(index, wpd->shading.flag & V3D_SHADING_OBJECT_OUTLINE, 1 << 4);
 	SET_FLAG_FROM_TEST(index, MATDATA_PASS_ENABLED(wpd), 1 << 5);
+	BLI_assert(index < MAX_COMPOSITE_SHADERS);
 	return index;
 }
 
@@ -194,6 +195,7 @@ int workbench_material_get_prepass_shader_index(
 	SET_FLAG_FROM_TEST(index, MATCAP_ENABLED(wpd), 1 << 4);
 	SET_FLAG_FROM_TEST(index, use_textures, 1 << 5);
 	SET_FLAG_FROM_TEST(index, wpd->world_clip_planes != NULL, 1 << 6);
+	BLI_assert(index < MAX_PREPASS_SHADERS);
 	return index;
 }
 
@@ -205,6 +207,9 @@ int workbench_material_get_accum_shader_index(WORKBENCH_PrivateData *wpd, bool u
 	index = SPECULAR_HIGHLIGHT_ENABLED(wpd) ? 3 : wpd->shading.light;
 	SET_FLAG_FROM_TEST(index, use_textures, 1 << 2);
 	SET_FLAG_FROM_TEST(index, is_hair, 1 << 3);
+	/* 1 bits SHADOWS (only facing factor) */
+	SET_FLAG_FROM_TEST(index, SHADOW_ENABLED(wpd), 1 << 4);
+	BLI_assert(index < MAX_ACCUM_SHADERS);
 	return index;
 }
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 90b2c7a3369..e9c98b020ac 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -45,7 +45,7 @@
 #define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
 #define MAX_COMPOSITE_SHADERS (1 << 6)
 #define MAX_PREPASS_SHADERS (1 << 7)
-#define MAX_ACCUM_SHADERS (1 << 4)
+#define MAX_ACCUM_SHADERS (1 << 5)
 #define MAX_CAVITY_SHADERS (1 << 3)
 
 #define TEXTURE_DRAWING_ENABLED(wpd) (wpd->shading.color_type == V3D_SHADING_TEXTURE_COLOR)
@@ -212,6 +212,8 @@ typedef struct WORKBENCH_PrivateData {
 	struct DRWShadingGroup *depth_shgrp;
 	WORKBENCH_UBO_World world_data;
 	float shadow_multiplier;
+	float shadow_shift;
+	float shadow_focus;
 	float cached_shadow_direction[3];
 	float shadow_mat[4][4];
 	float shadow_inv[4][4];



More information about the Bf-blender-cvs mailing list