[Bf-blender-cvs] [606f1d80b39] tmp-workbench-rewrite: Workbench: Refactor: Add Shadow support
Clément Foucault
noreply at git.blender.org
Tue Mar 3 17:36:06 CET 2020
Commit: 606f1d80b39a978f32aaae5a0cd22e18775dd36a
Author: Clément Foucault
Date: Sun Mar 1 23:50:05 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB606f1d80b39a978f32aaae5a0cd22e18775dd36a
Workbench: Refactor: Add Shadow support
===================================================================
M source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.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_engine.c
M source/blender/draw/engines/workbench/workbench_materials.c
M source/blender/draw/engines/workbench/workbench_opaque.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_shader.c
M source/blender/draw/engines/workbench/workbench_shadow.c
M source/blender/draw/engines/workbench/workbench_studiolight.c
M source/blender/draw/engines/workbench/workbench_transparent.c
M source/blender/draw/intern/draw_hair.c
===================================================================
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 0616043aef0..cdb9823096c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -38,5 +38,7 @@ void main()
fragColor.rgb = base_color;
#endif
+ fragColor.rgb *= get_shadow(N);
+
fragColor.a = 1.0;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 83ee73b00d8..75fde40bc94 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -9,6 +9,11 @@ struct WorldData {
vec4 viewport_size;
vec4 object_outline_color;
vec4 shadow_direction_vs;
+ float shadow_focus;
+ float shadow_shift;
+ float shadow_mul;
+ float shadow_add;
+ /* - 16 bytes alignment- */
LightData lights[4];
vec4 ambient_color;
int matcap_orientation;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
index 6b0741b6d1b..6fa76510e6e 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
@@ -1,15 +1,19 @@
out vec4 fragColor;
+layout(location = 0) out vec4 materialData;
+layout(location = 1) out vec4 normalData;
+layout(location = 2) out uint objectId;
+
void main()
{
- const float intensity = 0.25;
+ const float a = 0.25;
#ifdef SHADOW_PASS
- fragColor = vec4(
- (gl_FrontFacing) ? vec3(intensity, -intensity, 0.0) : vec3(-intensity, intensity, 0.0), 1.0);
+ materialData.rgb = gl_FrontFacing ? vec3(a, -a, 0.0) : vec3(-a, a, 0.0);
#else
- fragColor = vec4((gl_FrontFacing) ? vec3(intensity, intensity, -intensity) :
- vec3(-intensity, -intensity, intensity),
- 1.0);
+ materialData.rgb = gl_FrontFacing ? vec3(a, a, -a) : vec3(-a, -a, a);
#endif
+ materialData.a = 0.0;
+ normalData = vec4(0.0);
+ objectId = 0u;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
index e1b031e7294..7113b998fa7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
@@ -79,6 +79,8 @@ void main()
vec3 shaded_color = color;
#endif
+ shaded_color *= get_shadow(N);
+
/* Listing 4 */
float weight = calculate_transparent_weight() * alpha_interp;
transparentAccum = vec4(shaded_color * weight, alpha_interp);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
index e7c94c9b955..1c966a9e47c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
@@ -121,3 +121,13 @@ vec3 get_world_lighting(vec3 base_color, float roughness, float metallic, vec3 N
return diffuse_light + specular_light;
}
+
+uniform bool forceShadowing = false;
+
+float get_shadow(vec3 N)
+{
+ float light_factor = -dot(N, world_data.shadow_direction_vs.xyz);
+ float shadow_mix = smoothstep(world_data.shadow_shift, world_data.shadow_focus, light_factor);
+ shadow_mix *= forceShadowing ? 0.0 : world_data.shadow_mul;
+ return shadow_mix + world_data.shadow_add;
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index ad5eaff2392..937c6a33319 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -79,17 +79,44 @@ static WORKBENCH_ViewLayerData *workbench_view_layer_data_ensure_ex(struct ViewL
return *vldata;
}
-static void workbench_world_data_update_shadow_direction_vs(WORKBENCH_PrivateData *wpd)
+void workbench_private_data_get_light_direction(float r_light_direction[3])
{
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ Scene *scene = draw_ctx->scene;
+
+ copy_v3_v3(r_light_direction, scene->display.light_direction);
+ SWAP(float, r_light_direction[2], r_light_direction[1]);
+ r_light_direction[2] = -r_light_direction[2];
+ r_light_direction[0] = -r_light_direction[0];
+}
+
+static void workbench_shadow_world_data_update(WORKBENCH_PrivateData *wpd)
+{
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const Scene *scene = draw_ctx->scene;
+
WORKBENCH_UBO_World *wd = &wpd->world_data;
- float light_direction[3];
float view_matrix[4][4];
DRW_view_viewmat_get(NULL, view_matrix, false);
- workbench_private_data_get_light_direction(light_direction);
+ workbench_private_data_get_light_direction(wpd->light_direction_ws);
/* Shadow direction. */
- mul_v3_mat3_m4v3(wd->shadow_direction_vs, view_matrix, light_direction);
+ mul_v3_mat3_m4v3(wd->shadow_direction_vs, view_matrix, wpd->light_direction_ws);
+
+ /* Clamp to avoid overshadowing and shading errors. */
+ float focus = clamp_f(scene->display.shadow_focus, 0.0001f, 0.99999f);
+ wd->shadow_shift = scene->display.shadow_shift;
+ wd->shadow_focus = 1.0f - focus * (1.0f - wd->shadow_shift);
+
+ if (SHADOW_ENABLED(wpd)) {
+ wd->shadow_mul = wpd->shading.shadow_intensity;
+ wd->shadow_add = 1.0f - wd->shadow_mul;
+ }
+ else {
+ wd->shadow_mul = 0.0f;
+ wd->shadow_add = 1.0f;
+ }
}
/* \} */
@@ -205,13 +232,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
wpd->studio_light = BKE_studiolight_find(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;
wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
@@ -227,7 +247,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
wd->curvature_ridge = 0.5f / max_ff(SQUARE(wpd->shading.curvature_ridge_factor), 1e-4f);
wd->curvature_valley = 0.7f / max_ff(SQUARE(wpd->shading.curvature_valley_factor), 1e-4f);
- workbench_world_data_update_shadow_direction_vs(wpd);
+ workbench_shadow_world_data_update(wpd);
workbench_viewvecs_update(wpd->world_data.viewvecs);
copy_v2_v2(wpd->world_data.viewport_size, DRW_viewport_size_get());
copy_v2_v2(wpd->world_data.viewport_size_inv, DRW_viewport_invert_size_get());
@@ -296,17 +316,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
BLI_listbase_clear(&wpd->smoke_domains);
}
-void workbench_private_data_get_light_direction(float r_light_direction[3])
-{
- const DRWContextState *draw_ctx = DRW_context_state_get();
- Scene *scene = draw_ctx->scene;
-
- copy_v3_v3(r_light_direction, scene->display.light_direction);
- SWAP(float, r_light_direction[2], r_light_direction[1]);
- r_light_direction[2] = -r_light_direction[2];
- r_light_direction[0] = -r_light_direction[0];
-}
-
void workbench_update_material_ubos(WORKBENCH_PrivateData *UNUSED(wpd))
{
const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index f1528c2213c..4bd0e663650 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -334,12 +334,6 @@ static struct GPUTexture *create_jitter_texture(int num_samples)
}
/* Functions */
-static void workbench_init_object_data(DrawData *dd)
-{
- WORKBENCH_ObjectData *data = (WORKBENCH_ObjectData *)dd;
- data->shadow_bbox_dirty = true;
-}
-
static void workbench_init_oit_framebuffer(WORKBENCH_FramebufferList *fbl,
DefaultTextureList *dtxl)
{
@@ -732,7 +726,7 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
/* Deferred Mix Pass */
{
workbench_private_data_get_light_direction(e_data.display.light_direction);
- studiolight_update_light(wpd, e_data.display.light_direction);
+ studiolight_update_light(wpd);
if (SHADOW_ENABLED(wpd)) {
psl->composite_pass = DRW_pass_create(
@@ -1161,11 +1155,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
}
else {
WORKBENCH_ObjectData *engine_object_data = (WORKBENCH_ObjectData *)DRW_drawdata_ensure(
- &ob->id,
- &draw_engine_workbench_solid,
- sizeof(WORKBENCH_ObjectData),
- &workbench_init_object_data,
- NULL);
+ &ob->id, &draw_engine_workbench_solid, sizeof(WORKBENCH_ObjectData), NULL, NULL);
if (studiolight_object_cast_visible_shadow(wpd, ob, engine_object_data)) {
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 06a8508c997..ac0a4e6221a 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -82,6 +82,7 @@ static void workbench_cache_init(void *ved)
workbench_opaque_cache_init(vedata);
workbench_transparent_cache_init(vedata);
+ workbench_shadow_cache_init(vedata);
// workbench_aa_create_pass(vedata);
// workbench_dof_create_pass(vedata);
@@ -105,14 +106,14 @@ static void workbench_cache_sculpt_populate(WORKBENCH_PrivateData *wpd, Object *
BLI_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list