[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