[Bf-blender-cvs] [3e4c78e7ba9] blender2.8-workbench: Workbench: Shadows

Jeroen Bakker noreply at git.blender.org
Tue May 1 19:24:01 CEST 2018


Commit: 3e4c78e7ba9b198f6047a900cf9d65edb0ecf94b
Author: Jeroen Bakker
Date:   Tue May 1 19:23:23 2018 +0200
Branches: blender2.8-workbench
https://developer.blender.org/rB3e4c78e7ba9b198f6047a900cf9d65edb0ecf94b

Workbench: Shadows

Fix negation of light direction
added SHOW_SHADOW_VOLUME option

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

M	source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
M	source/blender/draw/engines/workbench/workbench_materials.c

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
index 62a538666e4..9d6da35c314 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
@@ -28,12 +28,10 @@ void main()
 	bool front1 = dot(faceNormal1[0], light_direction) >= 0;
 	bool front2 = dot(faceNormal2[0], light_direction) >= 0;
 
-	if (front1 != front2) {
-		if (!front1 && front2) {
-			emit_quad(gl_in[0].gl_Position, gl_in[1].gl_Position, vec4(light_direction, 0.0));
-		}
-		else if (front1 && !front2) {
-			emit_quad(gl_in[1].gl_Position, gl_in[0].gl_Position, vec4(light_direction, 0.0));
-		}
+	if (!front1 && front2) {
+		emit_quad(gl_in[0].gl_Position, gl_in[1].gl_Position, vec4(light_direction, 0.0));
+	}
+	else if (front1 && !front2) {
+		emit_quad(gl_in[1].gl_Position, gl_in[0].gl_Position, vec4(light_direction, 0.0));
 	}
 }
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 4a26e33e480..4df5f31390e 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -36,6 +36,8 @@
 #include "UI_resources.h"
 
 /* *********** STATIC *********** */
+
+// #define SHOW_SHADOW_VOLUME
 #define MAX_SHADERS 255
 static struct {
 	struct GPUShader *prepass_sh_cache[MAX_SHADERS];
@@ -309,7 +311,7 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 		DRW_uniformbuffer_update(wpd->world_ubo, &wpd->world_data);
 
 		copy_v3_v3(e_data.light_direction, BKE_collection_engine_property_value_get_float_array(props, "light_direction"));
-		invert_v3(e_data.light_direction);
+		negate_v3(e_data.light_direction);
 
 		psl->composite_pass = DRW_pass_create("Composite", DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL);
 		grp = DRW_shgroup_create(wpd->composite_sh, psl->composite_pass);
@@ -319,6 +321,13 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 		DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
 
 		if (SHADOW_ENABLED(wpd)) {
+#ifdef SHOW_SHADOW_VOLUME
+			psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_COLOR );
+			grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
+			DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction, 1);
+			DRW_shgroup_stencil_mask(grp, 0xFF);
+			wpd->shadow_shgrp = grp;
+#else
 			psl->shadow_pass = DRW_pass_create("Shadow", DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_INCR_DECR_WRAP);
 			grp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass);
 			DRW_shgroup_uniform_vec3(grp, "lightDirection", e_data.light_direction, 1);
@@ -331,6 +340,7 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata)
 			workbench_composite_uniforms(wpd, grp);
 			DRW_shgroup_uniform_float(grp, "lightMultiplier", &e_data.shadow_multiplier, 1);
 			DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
+#endif
 		}
 	}
 }
@@ -468,11 +478,17 @@ void workbench_materials_draw_scene(WORKBENCH_Data *vedata)
 	GPU_framebuffer_bind(fbl->prepass_fb);
 	DRW_draw_pass(psl->prepass_pass);
 	if (SHADOW_ENABLED(wpd)) {
+#ifdef SHOW_SHADOW_VOLUME
+		GPU_framebuffer_bind(dfbl->default_fb);
+		DRW_draw_pass(psl->composite_pass);
+		DRW_draw_pass(psl->shadow_pass);
+#else
 		GPU_framebuffer_bind(dfbl->depth_only_fb);
 		DRW_draw_pass(psl->shadow_pass);
 		GPU_framebuffer_bind(dfbl->default_fb);
 		DRW_draw_pass(psl->composite_pass);
 		DRW_draw_pass(psl->composite_shadow_pass);
+#endif
 	}
 	else {
 		GPU_framebuffer_bind(dfbl->default_fb);



More information about the Bf-blender-cvs mailing list