Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2021-11-26 20:15:50 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-12-04 00:41:37 +0300
commit26335dfc57ec9a84e0e1e2fe42c41f9e74b7f0a4 (patch)
treeb20eccef021634f1f0112441b2a29e464a24e34d /source/blender/draw/engines
parent1b00ca35758dacf7ece7b95275ea3c41e53bec6c (diff)
EEVEE: Light: Merge ShadowData into LightData
This is because the light indices can now change because of the culling. So the shadow data needs to follow.
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r--source/blender/draw/engines/eevee/eevee_light.cc8
-rw-r--r--source/blender/draw/engines/eevee/eevee_shader_shared.hh139
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_light_eval_lib.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_surface_forward_frag.glsl5
6 files changed, 74 insertions, 93 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_light.cc b/source/blender/draw/engines/eevee/eevee_light.cc
index d73d650d78a..2f6a4e32ca4 100644
--- a/source/blender/draw/engines/eevee/eevee_light.cc
+++ b/source/blender/draw/engines/eevee/eevee_light.cc
@@ -315,7 +315,6 @@ void LightModule::end_sync(void)
batch_len_ = divide_ceil_u(max_ii(light_refs_.size(), 1), CULLING_BATCH_SIZE);
lights_data.resize(batch_len_ * CULLING_BATCH_SIZE);
- shadows_data.resize(batch_len_ * CULLING_BATCH_SIZE);
culling_key_buf.resize(batch_len_ * CULLING_BATCH_SIZE);
culling_light_buf.resize(batch_len_ * CULLING_BATCH_SIZE);
culling_zbin_buf.resize(batch_len_ * CULLING_ZBIN_COUNT);
@@ -328,20 +327,18 @@ void LightModule::end_sync(void)
for (auto l_idx : light_refs_.index_range()) {
Light &light = *light_refs_[l_idx];
lights_data[l_idx] = light;
- lights_data[l_idx].shadow_id = LIGHT_NO_SHADOW;
if (light.shadow_id != LIGHT_NO_SHADOW) {
if (light.type == LIGHT_SUN) {
- shadows_data[l_idx] = this->inst_.shadows.directionals[light.shadow_id];
+ lights_data[l_idx].shadow_data = this->inst_.shadows.directionals[light.shadow_id];
}
else {
- shadows_data[l_idx] = this->inst_.shadows.punctuals[light.shadow_id];
+ lights_data[l_idx].shadow_data = this->inst_.shadows.punctuals[light.shadow_id];
}
}
}
lights_data.push_update();
- shadows_data.push_update();
{
culling_ps_ = DRW_pass_create("CullingLight", (DRWState)0);
@@ -470,7 +467,6 @@ void LightModule::shgroup_resources(DRWShadingGroup *grp)
DRW_shgroup_vertex_buffer_ref(grp, "lights_zbins_buf", &culling_zbin_buf);
DRW_shgroup_vertex_buffer_ref(grp, "lights_tile_buf", &culling_tile_buf);
- DRW_shgroup_vertex_buffer_ref(grp, "shadows_buf", &shadows_data);
DRW_shgroup_uniform_texture(grp, "shadow_atlas_tx", inst_.shadows.atlas_tx_get());
DRW_shgroup_uniform_texture(grp, "shadow_tilemaps_tx", inst_.shadows.tilemap_tx_get());
}
diff --git a/source/blender/draw/engines/eevee/eevee_shader_shared.hh b/source/blender/draw/engines/eevee/eevee_shader_shared.hh
index 6801d4cbd59..34d9287d31c 100644
--- a/source/blender/draw/engines/eevee/eevee_shader_shared.hh
+++ b/source/blender/draw/engines/eevee/eevee_shader_shared.hh
@@ -434,74 +434,6 @@ static inline int culling_z_to_zbin(CullingData data, float z)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Lights
- * \{ */
-
-#define LIGHT_NO_SHADOW -1
-
-enum eLightType : uint32_t {
- LIGHT_SUN = 0u,
- LIGHT_POINT = 1u,
- LIGHT_SPOT = 2u,
- LIGHT_RECT = 3u,
- LIGHT_ELLIPSE = 4u
-};
-
-static inline bool is_area_light(eLightType type)
-{
- return type >= LIGHT_RECT;
-}
-
-struct LightData {
- /** Normalized obmat. Last column contains data accessible using the following macros. */
- mat4 object_mat;
- /** Packed data in the last column of the object_mat. */
-#define _area_size_x object_mat[0][3]
-#define _area_size_y object_mat[1][3]
-#define _radius _area_size_x
-#define _spot_mul object_mat[2][3]
-#define _spot_bias object_mat[3][3]
- /** Aliases for axes. */
-#ifdef __cplusplus
-# define _right object_mat[0]
-# define _up object_mat[1]
-# define _back object_mat[2]
-# define _position object_mat[3]
-#else
-# define _right object_mat[0].xyz
-# define _up object_mat[1].xyz
-# define _back object_mat[2].xyz
-# define _position object_mat[3].xyz
-#endif
- /** Influence radius (inversed and squared) adjusted for Surface / Volume power. */
- float influence_radius_invsqr_surface;
- float influence_radius_invsqr_volume;
- /** Maximum influence radius. Used for culling. */
- float influence_radius_max;
- /** Index of the shadow struct on CPU. -1 means no shadow. */
- int shadow_id;
- /** NOTE: It is ok to use vec3 here. A float is declared right after it.
- * vec3 is also aligned to 16 bytes. */
- vec3 color;
- /** Power depending on shader type. */
- float diffuse_power;
- float specular_power;
- float volume_power;
- float transmit_power;
- /** Special radius factor for point lighting. */
- float radius_squared;
- /** Light Type. */
- eLightType type;
- /** Padding to sizeof(vec2). */
- float _pad1;
- /** Spot size. Aligned to size of vec2. */
- vec2 spot_size_inv;
-};
-BLI_STATIC_ASSERT_ALIGN(LightData, 16)
-
-/** \} */
-
-/* -------------------------------------------------------------------- */
/** \name Shadows
* \{ */
@@ -525,7 +457,6 @@ struct ShadowData {
* So after transformation, you are in the tilemap space [0..SHADOW_TILEMAP_RES]
* of the largest clipmap.
*/
- /** TODO(fclem) Could be move to light matrix. */
mat4 mat;
/** NOTE: It is ok to use vec3 here. A float is declared right after it.
* vec3 is also aligned to 16 bytes. */
@@ -598,6 +529,76 @@ struct ShadowTileMapData {
};
BLI_STATIC_ASSERT_ALIGN(ShadowTileMapData, 16)
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Lights
+ * \{ */
+
+#define LIGHT_NO_SHADOW -1
+
+enum eLightType : uint32_t {
+ LIGHT_SUN = 0u,
+ LIGHT_POINT = 1u,
+ LIGHT_SPOT = 2u,
+ LIGHT_RECT = 3u,
+ LIGHT_ELLIPSE = 4u
+};
+
+static inline bool is_area_light(eLightType type)
+{
+ return type >= LIGHT_RECT;
+}
+
+struct LightData {
+ /** Normalized obmat. Last column contains data accessible using the following macros. */
+ mat4 object_mat;
+ /** Packed data in the last column of the object_mat. */
+#define _area_size_x object_mat[0][3]
+#define _area_size_y object_mat[1][3]
+#define _radius _area_size_x
+#define _spot_mul object_mat[2][3]
+#define _spot_bias object_mat[3][3]
+ /** Aliases for axes. */
+#ifdef __cplusplus
+# define _right object_mat[0]
+# define _up object_mat[1]
+# define _back object_mat[2]
+# define _position object_mat[3]
+#else
+# define _right object_mat[0].xyz
+# define _up object_mat[1].xyz
+# define _back object_mat[2].xyz
+# define _position object_mat[3].xyz
+#endif
+ /** Influence radius (inversed and squared) adjusted for Surface / Volume power. */
+ float influence_radius_invsqr_surface;
+ float influence_radius_invsqr_volume;
+ /** Maximum influence radius. Used for culling. */
+ float influence_radius_max;
+ /** Index of the shadow struct on CPU. -1 means no shadow. */
+ int shadow_id;
+ /** NOTE: It is ok to use vec3 here. A float is declared right after it.
+ * vec3 is also aligned to 16 bytes. */
+ vec3 color;
+ /** Power depending on shader type. */
+ float diffuse_power;
+ float specular_power;
+ float volume_power;
+ float transmit_power;
+ /** Special radius factor for point lighting. */
+ float radius_squared;
+ /** Light Type. */
+ eLightType type;
+ /** Padding to sizeof(vec2). */
+ float _pad1;
+ /** Spot size. Aligned to size of vec2. */
+ vec2 spot_size_inv;
+ /** Associated shadow data. Only valid if shadow_id is not LIGHT_NO_SHADOW. */
+ ShadowData shadow_data;
+};
+BLI_STATIC_ASSERT_ALIGN(LightData, 16)
+
/**
* Shadow data for debugging the active light shadow.
*/
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl
index 14e38d6f1d6..41c38efc4fd 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_deferred_direct_frag.glsl
@@ -37,11 +37,6 @@ layout(std430, binding = 3) readonly restrict buffer lights_tile_buf
CullingWord lights_culling_words[];
};
-layout(std430, binding = 4) readonly restrict buffer shadows_buf
-{
- ShadowData shadows[];
-};
-
layout(std140) uniform grids_block
{
GridData grids[GRID_MAX];
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl
index 068db3e78fd..7e83ea356ca 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_deferred_volume_frag.glsl
@@ -35,11 +35,6 @@ layout(std430, binding = 3) readonly restrict buffer lights_tile_buf
CullingWord lights_culling_words[];
};
-layout(std430, binding = 4) readonly restrict buffer shadows_buf
-{
- ShadowData shadows[];
-};
-
uniform sampler2D transparency_data_tx;
uniform usampler2D volume_data_tx;
uniform sampler2DArray utility_tx;
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_light_eval_lib.glsl b/source/blender/draw/engines/eevee/shaders/eevee_light_eval_lib.glsl
index d3d5f859174..de2c7eaa34b 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_light_eval_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_light_eval_lib.glsl
@@ -8,7 +8,6 @@
* - lights_zbins
* - light_culling
* - lights_culling_words
- * - shadows
* - shadow_atlas_tx
* - shadow_tilemaps_tx
* - sss_transmittance_tx
@@ -46,7 +45,7 @@ void light_eval(ClosureDiffuse diffuse,
vec3 lL = light_world_to_local(light, -L) * dist;
float shadow_delta = shadow_delta_get(
- shadow_atlas_tx, shadow_tilemaps_tx, light, shadows[l_idx], lL, dist, P);
+ shadow_atlas_tx, shadow_tilemaps_tx, light, light.shadow_data, lL, dist, P);
/* Transmittance evaluation first to use initial visibility. */
if (diffuse.sss_id != 0u && light.diffuse_power > 0.0) {
@@ -59,7 +58,7 @@ void light_eval(ClosureDiffuse diffuse,
out_diffuse += light.color * intensity;
}
- visibility *= float(shadow_delta - shadows[l_idx].bias <= 0.0);
+ visibility *= float(shadow_delta - light.shadow_data.bias <= 0.0);
}
if (visibility < 1e-6) {
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_surface_forward_frag.glsl b/source/blender/draw/engines/eevee/shaders/eevee_surface_forward_frag.glsl
index 152bfbeacec..2a4f0176a08 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_surface_forward_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_surface_forward_frag.glsl
@@ -45,11 +45,6 @@ layout(std430, binding = 3) readonly restrict buffer lights_tile_buf
CullingWord lights_culling_words[];
};
-layout(std430, binding = 4) readonly restrict buffer shadows_buf
-{
- ShadowData shadows[];
-};
-
layout(std140) uniform grids_block
{
GridData grids[GRID_MAX];