You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-10 13:00:37 +00:00
Merge pull request #100319 from Flarkk/fix_light_shadow_range
Fix shadows of long range `OmniLight3D` and `SpotLight3D`
This commit is contained in:
@@ -2614,9 +2614,9 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|||||||
Rect2 atlas_rect_norm = atlas_rect;
|
Rect2 atlas_rect_norm = atlas_rect;
|
||||||
atlas_rect_norm.position /= float(atlas_size);
|
atlas_rect_norm.position /= float(atlas_size);
|
||||||
atlas_rect_norm.size /= float(atlas_size);
|
atlas_rect_norm.size /= float(atlas_size);
|
||||||
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), false);
|
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), zfar, false);
|
||||||
atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size;
|
atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size;
|
||||||
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), true);
|
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), zfar, true);
|
||||||
|
|
||||||
//restore transform so it can be properly used
|
//restore transform so it can be properly used
|
||||||
light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0);
|
light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0);
|
||||||
|
|||||||
@@ -1382,9 +1382,9 @@ void RenderForwardMobile::_render_shadow_pass(RID p_light, RID p_shadow_atlas, i
|
|||||||
Rect2 atlas_rect_norm = atlas_rect;
|
Rect2 atlas_rect_norm = atlas_rect;
|
||||||
atlas_rect_norm.position /= float(atlas_size);
|
atlas_rect_norm.position /= float(atlas_size);
|
||||||
atlas_rect_norm.size /= float(atlas_size);
|
atlas_rect_norm.size /= float(atlas_size);
|
||||||
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), false);
|
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), zfar, false);
|
||||||
atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size;
|
atlas_rect_norm.position += Vector2(dual_paraboloid_offset) * atlas_rect_norm.size;
|
||||||
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), light_projection.get_z_far(), true);
|
copy_effects->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect_norm, atlas_rect.size, light_projection.get_z_near(), zfar, true);
|
||||||
|
|
||||||
//restore transform so it can be properly used
|
//restore transform so it can be properly used
|
||||||
light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0);
|
light_storage->light_instance_set_shadow_transform(p_light, Projection(), light_storage->light_instance_get_base_transform(p_light), zfar, 0, 0, 0);
|
||||||
|
|||||||
@@ -2558,8 +2558,9 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
||||||
|
real_t z_near = 0.005f;
|
||||||
Projection cm;
|
Projection cm;
|
||||||
cm.set_perspective(90, 1, radius * 0.005f, radius);
|
cm.set_perspective(90, 1, z_near, radius);
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
RENDER_TIMESTAMP("Cull OmniLight3D Shadow Cube, Side " + itos(i));
|
RENDER_TIMESTAMP("Cull OmniLight3D Shadow Cube, Side " + itos(i));
|
||||||
@@ -2647,9 +2648,10 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
|||||||
|
|
||||||
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
real_t radius = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE);
|
||||||
real_t angle = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SPOT_ANGLE);
|
real_t angle = RSG::light_storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SPOT_ANGLE);
|
||||||
|
real_t z_near = 0.005f;
|
||||||
|
|
||||||
Projection cm;
|
Projection cm;
|
||||||
cm.set_perspective(angle * 2.0, 1.0, 0.005f * radius, radius);
|
cm.set_perspective(angle * 2.0, 1.0, z_near, radius);
|
||||||
|
|
||||||
Vector<Plane> planes = cm.get_projection_planes(light_transform);
|
Vector<Plane> planes = cm.get_projection_planes(light_transform);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user