1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-08 12:40:44 +00:00

Fix soft shadows by increasing the bit count for specialization constants.

This commit is contained in:
Dario
2024-10-28 10:26:50 -03:00
parent a3080477ac
commit 427ba09efc
5 changed files with 42 additions and 27 deletions

View File

@@ -108,10 +108,10 @@ public:
uint32_t projector_use_mipmaps : 1; uint32_t projector_use_mipmaps : 1;
uint32_t use_depth_fog : 1; uint32_t use_depth_fog : 1;
uint32_t use_lightmap_bicubic_filter : 1; uint32_t use_lightmap_bicubic_filter : 1;
uint32_t soft_shadow_samples : 4; uint32_t soft_shadow_samples : 6;
uint32_t penumbra_shadow_samples : 4; uint32_t penumbra_shadow_samples : 6;
uint32_t directional_soft_shadow_samples : 4; uint32_t directional_soft_shadow_samples : 6;
uint32_t directional_penumbra_shadow_samples : 4; uint32_t directional_penumbra_shadow_samples : 6;
}; };
uint32_t packed_0; uint32_t packed_0;

View File

@@ -322,7 +322,12 @@ void SceneShaderForwardMobile::ShaderData::_create_pipeline(PipelineKey p_pipeli
specialization_constants.push_back(sc); specialization_constants.push_back(sc);
sc.constant_id = 1; sc.constant_id = 1;
sc.float_value = p_pipeline_key.shader_specialization.packed_1; sc.int_value = p_pipeline_key.shader_specialization.packed_1;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT;
specialization_constants.push_back(sc);
sc.constant_id = 2;
sc.float_value = p_pipeline_key.shader_specialization.packed_2;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT; sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT;
specialization_constants.push_back(sc); specialization_constants.push_back(sc);

View File

@@ -74,22 +74,23 @@ public:
uint32_t use_depth_fog : 1; uint32_t use_depth_fog : 1;
uint32_t is_multimesh : 1; uint32_t is_multimesh : 1;
uint32_t use_lightmap_bicubic_filter : 1; uint32_t use_lightmap_bicubic_filter : 1;
uint32_t pad : 2; uint32_t soft_shadow_samples : 6;
uint32_t soft_shadow_samples : 4; uint32_t penumbra_shadow_samples : 6;
uint32_t penumbra_shadow_samples : 4; uint32_t directional_soft_shadow_samples : 6;
uint32_t directional_soft_shadow_samples : 4;
uint32_t directional_penumbra_shadow_samples : 4;
}; };
uint32_t packed_0; uint32_t packed_0;
}; };
union { union {
float luminance_multiplier; uint32_t directional_penumbra_shadow_samples : 6;
float packed_1; uint32_t packed_1;
}; };
uint32_t packed_2; union {
float luminance_multiplier;
float packed_2;
};
}; };
struct UbershaderConstants { struct UbershaderConstants {

View File

@@ -107,19 +107,19 @@ bool sc_use_lightmap_bicubic_filter() {
} }
uint sc_soft_shadow_samples() { uint sc_soft_shadow_samples() {
return (sc_packed_0() >> 8) & 15U; return (sc_packed_0() >> 8) & 63U;
} }
uint sc_penumbra_shadow_samples() { uint sc_penumbra_shadow_samples() {
return (sc_packed_0() >> 12) & 15U; return (sc_packed_0() >> 14) & 63U;
} }
uint sc_directional_soft_shadow_samples() { uint sc_directional_soft_shadow_samples() {
return (sc_packed_0() >> 16) & 15U; return (sc_packed_0() >> 20) & 63U;
} }
uint sc_directional_penumbra_shadow_samples() { uint sc_directional_penumbra_shadow_samples() {
return (sc_packed_0() >> 20) & 15U; return (sc_packed_0() >> 26) & 63U;
} }
float sc_luminance_multiplier() { float sc_luminance_multiplier() {

View File

@@ -22,8 +22,8 @@ layout(push_constant, std430) uniform DrawCall {
uint pad; uint pad;
#ifdef UBERSHADER #ifdef UBERSHADER
uint sc_packed_0; uint sc_packed_0;
float sc_packed_1; uint sc_packed_1;
uint sc_packed_2; float sc_packed_2;
uint uc_packed_0; uint uc_packed_0;
#endif #endif
} }
@@ -42,10 +42,14 @@ uint sc_packed_0() {
return draw_call.sc_packed_0; return draw_call.sc_packed_0;
} }
float sc_packed_1() { uint sc_packed_1() {
return draw_call.sc_packed_1; return draw_call.sc_packed_1;
} }
float sc_packed_2() {
return draw_call.sc_packed_2;
}
uint uc_cull_mode() { uint uc_cull_mode() {
return (draw_call.uc_packed_0 >> 0) & 3U; return (draw_call.uc_packed_0 >> 0) & 3U;
} }
@@ -54,16 +58,21 @@ uint uc_cull_mode() {
// Pull the constants from the pipeline's specialization constants. // Pull the constants from the pipeline's specialization constants.
layout(constant_id = 0) const uint pso_sc_packed_0 = 0; layout(constant_id = 0) const uint pso_sc_packed_0 = 0;
layout(constant_id = 1) const float pso_sc_packed_1 = 2.0; layout(constant_id = 1) const uint pso_sc_packed_1 = 0;
layout(constant_id = 2) const float pso_sc_packed_2 = 2.0;
uint sc_packed_0() { uint sc_packed_0() {
return pso_sc_packed_0; return pso_sc_packed_0;
} }
float sc_packed_1() { uint sc_packed_1() {
return pso_sc_packed_1; return pso_sc_packed_1;
} }
float sc_packed_2() {
return pso_sc_packed_2;
}
#endif #endif
bool sc_use_light_projector() { bool sc_use_light_projector() {
@@ -123,23 +132,23 @@ bool sc_use_lightmap_bicubic_filter() {
} }
uint sc_soft_shadow_samples() { uint sc_soft_shadow_samples() {
return (sc_packed_0() >> 16) & 15U; return (sc_packed_0() >> 14) & 63U;
} }
uint sc_penumbra_shadow_samples() { uint sc_penumbra_shadow_samples() {
return (sc_packed_0() >> 20) & 15U; return (sc_packed_0() >> 20) & 63U;
} }
uint sc_directional_soft_shadow_samples() { uint sc_directional_soft_shadow_samples() {
return (sc_packed_0() >> 24) & 15U; return (sc_packed_0() >> 26) & 63U;
} }
uint sc_directional_penumbra_shadow_samples() { uint sc_directional_penumbra_shadow_samples() {
return (sc_packed_0() >> 28) & 15U; return (sc_packed_1() >> 0) & 63U;
} }
float sc_luminance_multiplier() { float sc_luminance_multiplier() {
return sc_packed_1(); return sc_packed_2();
} }
/* Set 0: Base Pass (never changes) */ /* Set 0: Base Pass (never changes) */