|
@@ -823,6 +823,11 @@ void RasterizerSceneGLES3::_draw_sky(RID p_env, const Projection &p_projection,
|
|
|
} else {
|
|
|
camera = p_projection;
|
|
|
}
|
|
|
+
|
|
|
+ Projection correction;
|
|
|
+ correction.set_depth_correction(false, true, false);
|
|
|
+ camera = correction * camera;
|
|
|
+
|
|
|
Basis sky_transform = environment_get_sky_orientation(p_env);
|
|
|
sky_transform.invert();
|
|
|
sky_transform = sky_transform * p_transform.basis;
|
|
@@ -933,7 +938,7 @@ void RasterizerSceneGLES3::_update_sky_radiance(RID p_env, const Projection &p_p
|
|
|
Projection cm;
|
|
|
cm.set_perspective(90, 1, 0.01, 10.0);
|
|
|
Projection correction;
|
|
|
- correction.columns[1][1] = -1.0;
|
|
|
+ correction.set_depth_correction(true, true, false);
|
|
|
cm = correction * cm;
|
|
|
|
|
|
bool success = material_storage->shaders.sky_shader.version_bind_shader(shader_data->version, SkyShaderGLES3::MODE_CUBEMAP);
|
|
@@ -1546,7 +1551,7 @@ void RasterizerSceneGLES3::_fill_render_list(RenderListType p_render_list, const
|
|
|
// Needs to be called after _setup_lights so that directional_light_count is accurate.
|
|
|
void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_data, bool p_no_fog, const Size2i &p_screen_size, bool p_flip_y, const Color &p_default_bg_color, bool p_pancake_shadows, float p_shadow_bias) {
|
|
|
Projection correction;
|
|
|
- correction.columns[1][1] = p_flip_y ? -1.0 : 1.0;
|
|
|
+ correction.set_depth_correction(p_flip_y, true, false);
|
|
|
Projection projection = correction * p_render_data->cam_projection;
|
|
|
//store camera into ubo
|
|
|
GLES3::MaterialStorage::store_camera(projection, scene_state.ubo.projection_matrix);
|
|
@@ -1801,7 +1806,9 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b
|
|
|
shadow_data.blend_splits = uint32_t((shadow_mode != RS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL) && light_storage->light_directional_get_blend_splits(base));
|
|
|
for (int j = 0; j < 4; j++) {
|
|
|
Rect2 atlas_rect = li->shadow_transform[j].atlas_rect;
|
|
|
- Projection matrix = li->shadow_transform[j].camera;
|
|
|
+ Projection correction;
|
|
|
+ correction.set_depth_correction(false, true, false);
|
|
|
+ Projection matrix = correction * li->shadow_transform[j].camera;
|
|
|
float split = li->shadow_transform[MIN(limit, j)].split;
|
|
|
|
|
|
Projection bias;
|
|
@@ -2027,7 +2034,9 @@ void RasterizerSceneGLES3::_setup_lights(const RenderDataGLES3 *p_render_data, b
|
|
|
Projection bias;
|
|
|
bias.set_light_bias();
|
|
|
|
|
|
- Projection cm = li->shadow_transform[0].camera;
|
|
|
+ Projection correction;
|
|
|
+ correction.set_depth_correction(false, true, false);
|
|
|
+ Projection cm = correction * li->shadow_transform[0].camera;
|
|
|
Projection shadow_mtx = bias * cm * modelview;
|
|
|
GLES3::MaterialStorage::store_camera(shadow_mtx, shadow_data.shadow_matrix);
|
|
|
}
|
|
@@ -2274,11 +2283,11 @@ void RasterizerSceneGLES3::_render_shadow_pass(RID p_light, RID p_shadow_atlas,
|
|
|
scene_state.reset_gl_state();
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
scene_state.enable_gl_depth_draw(true);
|
|
|
- glDepthFunc(GL_LESS);
|
|
|
+ glDepthFunc(GL_GREATER);
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
|
glDrawBuffers(0, nullptr);
|
|
|
- RasterizerGLES3::clear_depth(1.0);
|
|
|
+ RasterizerGLES3::clear_depth(0.0);
|
|
|
if (needs_clear) {
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
}
|
|
@@ -2515,7 +2524,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
|
Projection projection = render_data.cam_projection;
|
|
|
if (render_data.reflection_probe.is_valid()) {
|
|
|
Projection correction;
|
|
|
- correction.columns[1][1] = -1.0;
|
|
|
+ correction.set_depth_correction(true, true, false);
|
|
|
projection = correction * render_data.cam_projection;
|
|
|
}
|
|
|
|
|
@@ -2554,11 +2563,11 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
scene_state.enable_gl_depth_draw(true);
|
|
|
scene_state.enable_gl_blend(false);
|
|
|
- glDepthFunc(GL_LEQUAL);
|
|
|
+ glDepthFunc(GL_GEQUAL);
|
|
|
scene_state.enable_gl_scissor_test(false);
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
|
- RasterizerGLES3::clear_depth(1.0);
|
|
|
+ RasterizerGLES3::clear_depth(0.0);
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
glDrawBuffers(0, nullptr);
|
|
|
|
|
@@ -2590,7 +2599,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
|
scene_state.enable_gl_scissor_test(false);
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
scene_state.enable_gl_depth_draw(true);
|
|
|
- glDepthFunc(GL_LEQUAL);
|
|
|
+ glDepthFunc(GL_GEQUAL);
|
|
|
|
|
|
{
|
|
|
GLuint db = GL_COLOR_ATTACHMENT0;
|
|
@@ -2598,7 +2607,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
|
}
|
|
|
|
|
|
if (!fb_cleared) {
|
|
|
- RasterizerGLES3::clear_depth(1.0);
|
|
|
+ RasterizerGLES3::clear_depth(0.0);
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
}
|
|
|
|
|
@@ -3559,12 +3568,12 @@ void RasterizerSceneGLES3::render_particle_collider_heightfield(RID p_collider,
|
|
|
scene_state.reset_gl_state();
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
scene_state.enable_gl_depth_draw(true);
|
|
|
- glDepthFunc(GL_LESS);
|
|
|
+ glDepthFunc(GL_GREATER);
|
|
|
|
|
|
glDrawBuffers(0, nullptr);
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
|
- RasterizerGLES3::clear_depth(1.0);
|
|
|
+ RasterizerGLES3::clear_depth(0.0);
|
|
|
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
@@ -3605,7 +3614,7 @@ void RasterizerSceneGLES3::_render_uv2(const PagedArray<RenderGeometryInstance *
|
|
|
scene_state.reset_gl_state();
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
scene_state.enable_gl_depth_draw(true);
|
|
|
- glDepthFunc(GL_LESS);
|
|
|
+ glDepthFunc(GL_GREATER);
|
|
|
|
|
|
TightLocalVector<GLenum> draw_buffers;
|
|
|
draw_buffers.push_back(GL_COLOR_ATTACHMENT0);
|
|
@@ -3738,7 +3747,7 @@ void RasterizerSceneGLES3::_render_buffers_debug_draw(Ref<RenderSceneBuffersGLES
|
|
|
copy_effects->copy_cube_to_rect(atlas_uv_rect);
|
|
|
|
|
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
|
|
|
- glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
|
|
|
+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
|
|
|
} else {
|
|
|
glBindTexture(GL_TEXTURE_2D, shadow_tex);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
|
|
@@ -3746,7 +3755,7 @@ void RasterizerSceneGLES3::_render_buffers_debug_draw(Ref<RenderSceneBuffersGLES
|
|
|
copy_effects->copy_to_rect(atlas_uv_rect);
|
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3782,7 +3791,7 @@ void RasterizerSceneGLES3::_render_buffers_debug_draw(Ref<RenderSceneBuffersGLES
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_GREATER);
|
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
}
|
|
|
}
|