diff --git a/drivers/gles3/storage/light_storage.cpp b/drivers/gles3/storage/light_storage.cpp index f58f769b3e4..75dbd8869da 100644 --- a/drivers/gles3/storage/light_storage.cpp +++ b/drivers/gles3/storage/light_storage.cpp @@ -350,7 +350,14 @@ AABB LightStorage::light_get_aabb(RID p_light) const { switch (light->type) { case RS::LIGHT_SPOT: { float len = light->param[RS::LIGHT_PARAM_RANGE]; - float size = Math::tan(Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE])) * len; + float angle = Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE]); + + if (angle > Math::PI * 0.5) { + // Light casts backwards as well. + return AABB(Vector3(-1, -1, -1) * len, Vector3(2, 2, 2) * len); + } + + float size = Math::sin(angle) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); }; case RS::LIGHT_OMNI: { diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp index bfbf85aa350..b0268c2c83d 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp @@ -432,7 +432,14 @@ AABB LightStorage::light_get_aabb(RID p_light) const { switch (light->type) { case RS::LIGHT_SPOT: { float len = light->param[RS::LIGHT_PARAM_RANGE]; - float size = Math::tan(Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE])) * len; + float angle = Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE]); + + if (angle > Math::PI * 0.5) { + // Light casts backwards as well. + return AABB(Vector3(-1, -1, -1) * len, Vector3(2, 2, 2) * len); + } + + float size = Math::sin(angle) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); }; case RS::LIGHT_OMNI: {