|
@@ -2149,6 +2149,7 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|
uint32_t atlas_size = 1;
|
|
uint32_t atlas_size = 1;
|
|
RID atlas_fb;
|
|
RID atlas_fb;
|
|
|
|
|
|
|
|
+ bool reverse_cull_face = light_storage->light_get_reverse_cull_face_mode(base);
|
|
bool using_dual_paraboloid = false;
|
|
bool using_dual_paraboloid = false;
|
|
bool using_dual_paraboloid_flip = false;
|
|
bool using_dual_paraboloid_flip = false;
|
|
Vector2i dual_paraboloid_offset;
|
|
Vector2i dual_paraboloid_offset;
|
|
@@ -2292,7 +2293,7 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|
|
|
|
|
if (render_cubemap) {
|
|
if (render_cubemap) {
|
|
//rendering to cubemap
|
|
//rendering to cubemap
|
|
- _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, false, false, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, Rect2(), false, true, true, true, p_render_info);
|
|
|
|
|
|
+ _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, reverse_cull_face, false, false, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, Rect2(), false, true, true, true, p_render_info);
|
|
if (finalize_cubemap) {
|
|
if (finalize_cubemap) {
|
|
_render_shadow_process();
|
|
_render_shadow_process();
|
|
_render_shadow_end();
|
|
_render_shadow_end();
|
|
@@ -2310,7 +2311,7 @@ void RenderForwardClustered::_render_shadow_pass(RID p_light, RID p_shadow_atlas
|
|
|
|
|
|
} else {
|
|
} else {
|
|
//render shadow
|
|
//render shadow
|
|
- _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, atlas_rect, flip_y, p_clear_region, p_open_pass, p_close_pass, p_render_info);
|
|
|
|
|
|
+ _render_shadow_append(render_fb, p_instances, light_projection, light_transform, zfar, 0, 0, reverse_cull_face, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake, p_camera_plane, p_lod_distance_multiplier, p_screen_mesh_lod_threshold, atlas_rect, flip_y, p_clear_region, p_open_pass, p_close_pass, p_render_info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2323,7 +2324,7 @@ void RenderForwardClustered::_render_shadow_begin() {
|
|
scene_state.instance_data[RENDER_LIST_SECONDARY].clear();
|
|
scene_state.instance_data[RENDER_LIST_SECONDARY].clear();
|
|
}
|
|
}
|
|
|
|
|
|
-void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) {
|
|
|
|
|
|
+void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const PagedArray<RenderGeometryInstance *> &p_instances, const Projection &p_projection, const Transform3D &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_reverse_cull_face, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake, const Plane &p_camera_plane, float p_lod_distance_multiplier, float p_screen_mesh_lod_threshold, const Rect2i &p_rect, bool p_flip_y, bool p_clear_region, bool p_begin, bool p_end, RenderingMethod::RenderInfo *p_render_info) {
|
|
uint32_t shadow_pass_index = scene_state.shadow_passes.size();
|
|
uint32_t shadow_pass_index = scene_state.shadow_passes.size();
|
|
|
|
|
|
SceneState::ShadowPass shadow_pass;
|
|
SceneState::ShadowPass shadow_pass;
|
|
@@ -2370,6 +2371,10 @@ void RenderForwardClustered::_render_shadow_append(RID p_framebuffer, const Page
|
|
flip_cull = !flip_cull;
|
|
flip_cull = !flip_cull;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (p_reverse_cull_face) {
|
|
|
|
+ flip_cull = !flip_cull;
|
|
|
|
+ }
|
|
|
|
+
|
|
shadow_pass.element_from = render_list_from;
|
|
shadow_pass.element_from = render_list_from;
|
|
shadow_pass.element_count = render_list_size;
|
|
shadow_pass.element_count = render_list_size;
|
|
shadow_pass.flip_cull = flip_cull;
|
|
shadow_pass.flip_cull = flip_cull;
|