[Bf-blender-cvs] [278d174e358] tmp-eevee-shadowmap-refactor: Eevee: Shadows: Make shadowmap follow light orientation

Clément Foucault noreply at git.blender.org
Mon Sep 2 16:53:30 CEST 2019


Commit: 278d174e358d9028c27a2b0e6030aa8db59ea6c8
Author: Clément Foucault
Date:   Fri Aug 30 02:09:52 2019 +0200
Branches: tmp-eevee-shadowmap-refactor
https://developer.blender.org/rB278d174e358d9028c27a2b0e6030aa8db59ea6c8

Eevee: Shadows: Make shadowmap follow light orientation

This is in preparation of an optimization

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

M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lights_lib.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 777cda4c00e..6a7376db557 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -687,15 +687,18 @@ static void eevee_shadow_cube_setup(Object *ob,
   EEVEE_ShadowCube *cube_data = linfo->shadow_cube_data + sh_data->cube_id;
   Light *la = (Light *)ob->data;
 
+  normalize_m4_m4(cube_data->shadowmat, ob->obmat);
   copy_v3_v3(cube_data->position, ob->obmat[3]);
 
   if (linfo->soft_shadows) {
-    shadow_cube_random_position_set(evli, la, sample_ofs, cube_data->position);
+    shadow_cube_random_position_set(evli, la, sample_ofs, cube_data->shadowmat[3]);
   }
 
+  invert_m4(cube_data->shadowmat);
+
   ubo_data->bias = 0.05f * la->bias;
-  ubo_data->near = la->clipsta;
   ubo_data->far = sqrt(1.0f / evli->invsqrdist);
+  ubo_data->near = min_ff(la->clipsta, ubo_data->far - 1e-4);
 
   evli->shadowid = (float)(sh_data->shadow_id);
   ubo_data->shadow_start = (float)(sh_data->layer_id);
@@ -1126,21 +1129,23 @@ void EEVEE_lights_update(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
   }
 }
 
-static void eevee_ensure_cube_views(float near, float far, const float pos[3], DRWView *view[6])
+static void eevee_ensure_cube_views(float near,
+                                    float far,
+                                    const float viewmat[4][4],
+                                    DRWView *view[6])
 {
-  float winmat[4][4], viewmat[4][4];
+  float winmat[4][4];
   perspective_m4(winmat, -near, near, -near, near, near, far);
 
   for (int i = 0; i < 6; i++) {
-    unit_m4(viewmat);
-    negate_v3_v3(viewmat[3], pos);
-    mul_m4_m4m4(viewmat, cubefacemat[i], viewmat);
+    float tmp[4][4];
+    mul_m4_m4m4(tmp, cubefacemat[i], viewmat);
 
     if (view[i] == NULL) {
-      view[i] = DRW_view_create(viewmat, winmat, NULL, NULL, NULL);
+      view[i] = DRW_view_create(tmp, winmat, NULL, NULL, NULL);
     }
     else {
-      DRW_view_update(view[i], viewmat, winmat, NULL, NULL);
+      DRW_view_update(view[i], tmp, winmat, NULL, NULL);
     }
   }
 }
@@ -1207,7 +1212,6 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWView
   /* Render each shadow to one layer of the array */
   for (i = 0; (ob = linfo->shadow_cube_ref[i]) && (i < MAX_SHADOW_CUBE); i++) {
     EEVEE_LightEngineData *led = EEVEE_light_data_ensure(ob);
-    Light *la = (Light *)ob->data;
 
     if (!led->need_update || !cube_visible[i]) {
       continue;
@@ -1216,12 +1220,13 @@ void EEVEE_draw_shadows(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, DRWView
     EEVEE_ShadowRender *srd = &linfo->shadow_render_data;
     EEVEE_ShadowCubeData *evscd = &led->data.scd;
     EEVEE_ShadowCube *cube_data = linfo->shadow_cube_data + evscd->cube_id;
+    EEVEE_Shadow *ubo_data = linfo->shadow_data + evscd->shadow_id;
 
-    srd->clip_near = la->clipsta;
-    srd->clip_far = light_attenuation_radius_get(la, light_threshold);
+    srd->clip_near = ubo_data->near;
+    srd->clip_far = ubo_data->far;
 
     eevee_ensure_cube_views(
-        srd->clip_near, srd->clip_far, cube_data->position, g_data->cube_views);
+        srd->clip_near, srd->clip_far, cube_data->shadowmat, g_data->cube_views);
 
     /* Render shadow cube */
     /* Render 6 faces separately: seems to be faster for the general case.
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index a7fe5a7a9b9..59c3213ae56 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -39,7 +39,7 @@ extern struct DrawEngineType draw_engine_eevee_type;
 #define MAX_PLANAR 16 /* TODO : find size by dividing UBO max size by grid data size */
 #define MAX_LIGHT 128 /* TODO : find size by dividing UBO max size by light data size */
 #define MAX_CASCADE_NUM 4
-#define MAX_SHADOW 256 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */
+#define MAX_SHADOW 128 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */
 #define MAX_SHADOW_CASCADE 8
 #define MAX_SHADOW_CUBE (MAX_SHADOW - MAX_CASCADE_NUM * MAX_SHADOW_CASCADE)
 #define MAX_BLOOM_STEP 16
@@ -380,7 +380,8 @@ typedef struct EEVEE_Shadow {
 } EEVEE_Shadow;
 
 typedef struct EEVEE_ShadowCube {
-  float position[3], pad;
+  float shadowmat[4][4];
+  float position[3], _pad0[1];
 } EEVEE_ShadowCube;
 
 typedef struct EEVEE_ShadowCascade {
@@ -410,6 +411,12 @@ BLI_STATIC_ASSERT_ALIGN(EEVEE_ShadowCube, 16)
 BLI_STATIC_ASSERT_ALIGN(EEVEE_ShadowCascade, 16)
 BLI_STATIC_ASSERT_ALIGN(EEVEE_ShadowRender, 16)
 
+BLI_STATIC_ASSERT(sizeof(EEVEE_Shadow) * MAX_SHADOW +
+                          sizeof(EEVEE_ShadowCascade) * MAX_SHADOW_CASCADE +
+                          sizeof(EEVEE_ShadowCube) * MAX_SHADOW_CUBE <
+                      16384,
+                  "Shadow UBO is too big!!!")
+
 /* This is just a really long bitflag with special function to access it. */
 #define MAX_LIGHTBITS_FIELDS (MAX_LIGHT / 8)
 typedef struct EEVEE_LightBits {
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index f6a4fabe883..a5f40c028c2 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -62,6 +62,7 @@ struct ShadowData {
 };
 
 struct ShadowCubeData {
+  mat4 shadowmat;
   vec4 position;
 };
 
diff --git a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
index 1a962798004..85f8dd14a90 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_translucency_frag.glsl
@@ -103,7 +103,7 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, vec2 rand, f
     s *= range;
   }
   else {
-    vec3 cubevec = W - shadows_cube_data[int(data.sh_data_start)].position.xyz;
+    vec3 cubevec = transform_point(shadows_cube_data[int(data.sh_data_start)].shadowmat, W);
     dist = length(cubevec);
     cubevec /= dist;
     s = sample_cube(sssShadowCubes, cubevec, data.sh_tex_start).r;
diff --git a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
index 4ce3266f634..d1d01b1db9e 100644
--- a/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lights_lib.glsl
@@ -67,7 +67,7 @@ vec4 sample_cascade(sampler2DArray tex, vec2 co, float cascade_id)
 
 float sample_cube_shadow(ShadowData sd, ShadowCubeData scd, float texid, vec3 W)
 {
-  vec3 cubevec = W - scd.position.xyz;
+  vec3 cubevec = transform_point(scd.shadowmat, W);
 
   float dist = max_v3(abs(cubevec));
   dist = buffer_depth(true, dist, sd.sh_far, sd.sh_near);



More information about the Bf-blender-cvs mailing list