[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