[Bf-blender-cvs] [197af58baab] blender2.8: Workbench: Cleaner Shadow edges own shadow

Jeroen Bakker noreply at git.blender.org
Tue May 15 15:43:26 CEST 2018


Commit: 197af58baab1c1be7e6f371a829b31f5c1098a73
Author: Jeroen Bakker
Date:   Tue May 15 15:19:57 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB197af58baab1c1be7e6f371a829b31f5c1098a73

Workbench: Cleaner Shadow edges own shadow

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

M	release/scripts/startup/bl_ui/properties_scene.py
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_studiolight.c
M	source/blender/gpu/intern/gpu_texture.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index cf17adfe5c1..545d0d696dc 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -441,6 +441,7 @@ class SCENE_PT_viewport_display(SceneButtonsPanel, Panel):
         layout = self.layout
         scene = context.scene
         layout.prop(scene.display, "light_direction", text="")
+        layout.prop(scene.display, "shadow_shift")
 
 
 class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f95da4f723f..5fde2db0d15 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -824,6 +824,7 @@ void BKE_scene_init(Scene *sce)
 
 	/* SceneDisplay */
 	copy_v3_v3(sce->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
+	sce->display.shadow_shift = 0.1;
 }
 
 Scene *BKE_scene_add(Main *bmain, const char *name)
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 08cb81bb357..2af10d3faf6 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -1085,6 +1085,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 				copy_v3_v3(scene->display.light_direction, (float[3]){-M_SQRT1_3, -M_SQRT1_3, M_SQRT1_3});
 			}
 		}
+		if (!DNA_struct_elem_find(fd->filesdna, "SceneDisplay", "float", "shadow_shift")) {
+			for (Scene *scene = main->scene.first; scene; scene = scene->id.next) {
+				scene->display.shadow_shift = 0.1;
+			}
+		}
 
 		if (!DNA_struct_elem_find(fd->filesdna, "Object", "ObjectDisplay", "display")) {
 			/* Initialize new object.ObjectDisplay */
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 7f7e8f9c69c..09bdffe3299 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -7,6 +7,10 @@ uniform sampler2D normalBuffer;
 uniform vec2 invertedViewportSize;
 uniform vec3 objectOverlapColor = vec3(0.0);
 uniform float shadowMultiplier;
+uniform float lightMultiplier;
+uniform float shadowShift = 0.1;
+
+uniform vec3 lightDirection; /* light direction in view space */
 
 layout(std140) uniform world_block {
 	WorldData world_data;
@@ -38,29 +42,42 @@ void main()
 	}
 #endif /* !V3D_SHADING_OBJECT_OVERLAP */
 
-
-#ifdef V3D_LIGHTING_STUDIO
 	vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
+/* Do we need normals */
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 #ifdef WORKBENCH_ENCODE_NORMALS
 	vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
 	if (diffuse_color.a == 1.0) {
-		normal_viewport = - normal_viewport;
+		normal_viewport = -normal_viewport;
 	}
 #else /* WORKBENCH_ENCODE_NORMALS */
 	vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
 #endif /* WORKBENCH_ENCODE_NORMALS */
+#endif
+
+
+#ifdef V3D_LIGHTING_STUDIO
 	vec3 diffuse_light = get_world_diffuse_light(world_data, normal_viewport);
-	vec3 shaded_color = diffuse_light * diffuse_color.rgb * (1.0 - shadowMultiplier);
+	vec3 shaded_color = diffuse_light * diffuse_color.rgb;
 
 #else /* V3D_LIGHTING_STUDIO */
-	vec3 diffuse_color = texelFetch(colorBuffer, texel, 0).rgb;
-	vec3 shaded_color = diffuse_color * (1.0 - shadowMultiplier);
+	vec3 shaded_color = diffuse_color.rgb;
+
 #endif /* V3D_LIGHTING_STUDIO */
 
+#ifdef V3D_SHADING_SHADOW
+	float shadow_mix = step(-shadowShift, dot(normal_viewport, lightDirection));
+	float light_multiplier;
+	light_multiplier = mix(lightMultiplier, shadowMultiplier, shadow_mix);
+
+#else /* V3D_SHADING_SHADOW */
+	float light_multiplier = 1.0;
+#endif /* V3D_SHADING_SHADOW */
+
+	shaded_color *= light_multiplier;
 
 #ifdef V3D_SHADING_OBJECT_OVERLAP
 	shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
 #endif /* V3D_SHADING_OBJECT_OVERLAP */
-
 	fragColor = vec4(shaded_color, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 54c5bce4271..2cc0ff3723d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -4,22 +4,22 @@ uniform vec3 object_color = vec3(1.0, 0.0, 1.0);
 uniform sampler2D image;
 #endif
 
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 #ifdef OB_TEXTURE
 in vec2 uv_interp;
 #endif /* OB_TEXTURE */
 
 layout(location=0) out uint objectId;
 layout(location=1) out vec4 diffuseColor;
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+	#ifdef WORKBENCH_ENCODE_NORMALS
 layout(location=2) out vec2 normalViewport;
-#else /* WORKBENCH_ENCODE_NORMALS */
+	#else /* WORKBENCH_ENCODE_NORMALS */
 layout(location=2) out vec3 normalViewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+	#endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 
 void main()
 {
@@ -31,18 +31,18 @@ void main()
 	diffuseColor = texture(image, uv_interp);
 #endif /* OB_TEXTURE */
 
-#ifdef V3D_LIGHTING_STUDIO
-#ifdef WORKBENCH_ENCODE_NORMALS
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
+	#ifdef WORKBENCH_ENCODE_NORMALS
 	if (!gl_FrontFacing) {
-		normalViewport = normal_encode(-normal_viewport);
+		normalViewport = normal_encode(normalize(-normal_viewport));
 		diffuseColor.a = 1.0;
 	}
 	else {
-		normalViewport = normal_encode(normal_viewport);
+		normalViewport = normal_encode(normalize(normal_viewport));
 		diffuseColor.a = 0.0;
 	}
-#else /* WORKBENCH_ENCODE_NORMALS */
+	#else /* WORKBENCH_ENCODE_NORMALS */
 	normalViewport = normal_viewport;
-#endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* V3D_LIGHTING_STUDIO */
+	#endif /* WORKBENCH_ENCODE_NORMALS */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 22b16bf1d6a..f2df117d897 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -1,19 +1,19 @@
 uniform mat4 ModelViewProjectionMatrix;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 uniform mat3 NormalMatrix;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 
 in vec3 pos;
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 nor;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 #ifdef OB_TEXTURE
 in vec2 uv;
 #endif
 
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 out vec3 normal_viewport;
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 #ifdef OB_TEXTURE
 out vec2 uv_interp;
 #endif
@@ -23,8 +23,8 @@ void main()
 #ifdef OB_TEXTURE
 	uv_interp = uv;
 #endif
-#ifdef V3D_LIGHTING_STUDIO
+#ifdef NORMAL_VIEWPORT_PASS_ENABLED
 	normal_viewport = normalize(NormalMatrix * nor);
-#endif /* V3D_LIGHTING_STUDIO */
+#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
 	gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
index 7322266a956..8ef1a8b589b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_vert.glsl
@@ -1,4 +1,4 @@
-#define EPSILON 0.000001
+#define EPSILON 0.0001
 #define INFINITE 100.0
 
 uniform mat4 ModelMatrixInverse;
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index f4b9a0a3e53..0f21b76b4d2 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -61,7 +61,8 @@ static struct {
 	struct GPUTexture *normal_buffer_tx; /* ref only, not alloced */
 	struct GPUTexture *composite_buffer_tx; /* ref only, not alloced */
 
-	float light_direction[3]; /* world light direction for shadows */
+	SceneDisplay display; /* world light direction for shadows */
+	float light_direction_vs[3];
 	int next_object_id;
 } e_data = {{NULL}};
 
@@ -82,8 +83,12 @@ extern char datatoc_workbench_world_light_lib_glsl[];
 extern DrawEngineType draw_engine_workbench_solid;
 
 #define OBJECT_ID_PASS_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP)
-#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO)
+#define NORMAL_VIEWPORT_PASS_ENABLED(wpd) (wpd->shading.light & V3D_LIGHTING_STUDIO || wpd->shading.flag & V3D_SHADING_SHADOW)
 #define SHADOW_ENABLED(wpd) (wpd->shading.flag & V3D_SHADING_SHADOW)
+#define NORMAL_ENCODING_ENABLED() (true)
+//(!SHADOW_ENABLED(wpd))
+
+
 static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
 {
 	char *str = NULL;
@@ -93,9 +98,15 @@ static char *workbench_build_defines(WORKBENCH_PrivateData *wpd, int drawtype)
 	if (wpd->shading.flag & V3D_SHADING_OBJECT_OVERLAP) {
 		BLI_dynstr_appendf(ds, "#define V3D_SHADING_OBJECT_OVERLAP\n");
 	}
+	if (wpd->shading.flag & V3D_SHADING_SHADOW) {
+		BLI_dynstr_appendf(ds, "#define V3D_SHADING_SHADOW\n");
+	}
 	if (wpd->shading.light & V3D_LIGHTING_STUDIO) {
 		BLI_dynstr_appendf(ds, "#define V3D_LIGHTING_STUDIO\n");
 	}
+	if (NORMAL_VIEWPORT_PASS_ENABLED(wpd)) {
+		BLI_dynstr_appendf(ds, "#define NORMAL_VIEWPORT_PASS_ENABLED\n");
+	}
 	switch (drawtype) {
 		case OB_SOLID:
 			BLI_dynstr_appendf(ds, "#define OB_SOLID\n");
@@ -105,9 +116,9 @@ static char *workbench_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list