[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