From 26335dfc57ec9a84e0e1e2fe42c41f9e74b7f0a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 26 Nov 2021 18:15:50 +0100 Subject: 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. --- source/blender/draw/engines/eevee/eevee_light.cc | 8 +- .../draw/engines/eevee/eevee_shader_shared.hh | 139 +++++++++++---------- .../eevee/shaders/eevee_deferred_direct_frag.glsl | 5 - .../eevee/shaders/eevee_deferred_volume_frag.glsl | 5 - .../eevee/shaders/eevee_light_eval_lib.glsl | 5 +- .../eevee/shaders/eevee_surface_forward_frag.glsl | 5 - 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 @@ -433,74 +433,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]; -- cgit v1.2.3