|
@@ -32,6 +32,7 @@
|
|
|
|
|
|
#include "drivers/gles3/effects/copy_effects.h"
|
|
#include "drivers/gles3/effects/copy_effects.h"
|
|
#include "drivers/gles3/effects/feed_effects.h"
|
|
#include "drivers/gles3/effects/feed_effects.h"
|
|
|
|
+#include "drivers/gles3/storage/material_storage.h"
|
|
#include "rasterizer_gles3.h"
|
|
#include "rasterizer_gles3.h"
|
|
#include "storage/config.h"
|
|
#include "storage/config.h"
|
|
#include "storage/mesh_storage.h"
|
|
#include "storage/mesh_storage.h"
|
|
@@ -223,10 +224,10 @@ void RasterizerSceneGLES3::_geometry_instance_add_surface_with_material(Geometry
|
|
flags |= GeometryInstanceSurface::FLAG_USES_DOUBLE_SIDED_SHADOWS;
|
|
flags |= GeometryInstanceSurface::FLAG_USES_DOUBLE_SIDED_SHADOWS;
|
|
}
|
|
}
|
|
|
|
|
|
- if (has_alpha || has_read_screen_alpha || p_material->shader_data->depth_draw == GLES3::SceneShaderData::DEPTH_DRAW_DISABLED || p_material->shader_data->depth_test == GLES3::SceneShaderData::DEPTH_TEST_DISABLED) {
|
|
|
|
|
|
+ if (has_alpha || has_read_screen_alpha || p_material->shader_data->depth_draw == GLES3::SceneShaderData::DEPTH_DRAW_DISABLED || p_material->shader_data->depth_test != GLES3::SceneShaderData::DEPTH_TEST_ENABLED) {
|
|
//material is only meant for alpha pass
|
|
//material is only meant for alpha pass
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_ALPHA;
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_ALPHA;
|
|
- if (p_material->shader_data->uses_depth_prepass_alpha && !(p_material->shader_data->depth_draw == GLES3::SceneShaderData::DEPTH_DRAW_DISABLED || p_material->shader_data->depth_test == GLES3::SceneShaderData::DEPTH_TEST_DISABLED)) {
|
|
|
|
|
|
+ if (p_material->shader_data->uses_depth_prepass_alpha && !(p_material->shader_data->depth_draw == GLES3::SceneShaderData::DEPTH_DRAW_DISABLED || p_material->shader_data->depth_test != GLES3::SceneShaderData::DEPTH_TEST_ENABLED)) {
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_DEPTH;
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_DEPTH;
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_SHADOW;
|
|
flags |= GeometryInstanceSurface::FLAG_PASS_SHADOW;
|
|
}
|
|
}
|
|
@@ -2184,7 +2185,7 @@ void RasterizerSceneGLES3::_render_shadow_pass(RID p_light, RID p_shadow_atlas,
|
|
scene_state.reset_gl_state();
|
|
scene_state.reset_gl_state();
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
- glDepthFunc(GL_GREATER);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GREATER);
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
glColorMask(0, 0, 0, 0);
|
|
glDrawBuffers(0, nullptr);
|
|
glDrawBuffers(0, nullptr);
|
|
@@ -2503,7 +2504,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_blend(false);
|
|
scene_state.enable_gl_blend(false);
|
|
- glDepthFunc(GL_GEQUAL);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GEQUAL);
|
|
scene_state.enable_gl_scissor_test(false);
|
|
scene_state.enable_gl_scissor_test(false);
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
glColorMask(0, 0, 0, 0);
|
|
@@ -2541,7 +2542,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
scene_state.enable_gl_scissor_test(false);
|
|
scene_state.enable_gl_scissor_test(false);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
- glDepthFunc(GL_GEQUAL);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GEQUAL);
|
|
|
|
|
|
{
|
|
{
|
|
GLuint db = GL_COLOR_ATTACHMENT0;
|
|
GLuint db = GL_COLOR_ATTACHMENT0;
|
|
@@ -2635,6 +2636,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
RENDER_TIMESTAMP("Render Sky");
|
|
RENDER_TIMESTAMP("Render Sky");
|
|
|
|
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GEQUAL);
|
|
scene_state.enable_gl_blend(false);
|
|
scene_state.enable_gl_blend(false);
|
|
scene_state.set_gl_cull_mode(RS::CULL_MODE_BACK);
|
|
scene_state.set_gl_cull_mode(RS::CULL_MODE_BACK);
|
|
|
|
|
|
@@ -3016,7 +3018,13 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
|
}
|
|
}
|
|
|
|
|
|
if constexpr (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) {
|
|
if constexpr (p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) {
|
|
- scene_state.enable_gl_depth_test(shader->depth_test == GLES3::SceneShaderData::DEPTH_TEST_ENABLED);
|
|
|
|
|
|
+ scene_state.enable_gl_depth_test(shader->depth_test != GLES3::SceneShaderData::DEPTH_TEST_DISABLED);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (shader->depth_test == GLES3::SceneShaderData::DEPTH_TEST_ENABLED_INVERTED) {
|
|
|
|
+ scene_state.set_gl_depth_func(GL_LESS);
|
|
|
|
+ } else {
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GEQUAL);
|
|
}
|
|
}
|
|
|
|
|
|
if constexpr (p_pass_mode != PASS_MODE_SHADOW) {
|
|
if constexpr (p_pass_mode != PASS_MODE_SHADOW) {
|
|
@@ -3713,7 +3721,7 @@ void RasterizerSceneGLES3::render_particle_collider_heightfield(RID p_collider,
|
|
scene_state.reset_gl_state();
|
|
scene_state.reset_gl_state();
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
- glDepthFunc(GL_GREATER);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GREATER);
|
|
|
|
|
|
glDrawBuffers(0, nullptr);
|
|
glDrawBuffers(0, nullptr);
|
|
|
|
|
|
@@ -3759,7 +3767,7 @@ void RasterizerSceneGLES3::_render_uv2(const PagedArray<RenderGeometryInstance *
|
|
scene_state.reset_gl_state();
|
|
scene_state.reset_gl_state();
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_test(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
- glDepthFunc(GL_GREATER);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_GREATER);
|
|
|
|
|
|
TightLocalVector<GLenum> draw_buffers;
|
|
TightLocalVector<GLenum> draw_buffers;
|
|
draw_buffers.push_back(GL_COLOR_ATTACHMENT0);
|
|
draw_buffers.push_back(GL_COLOR_ATTACHMENT0);
|
|
@@ -3852,7 +3860,7 @@ void RasterizerSceneGLES3::_render_buffers_debug_draw(Ref<RenderSceneBuffersGLES
|
|
glViewport(0, 0, shadow_atlas_size, shadow_atlas_size);
|
|
glViewport(0, 0, shadow_atlas_size, shadow_atlas_size);
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glActiveTexture(GL_TEXTURE0);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
scene_state.enable_gl_depth_draw(true);
|
|
- glDepthFunc(GL_ALWAYS);
|
|
|
|
|
|
+ scene_state.set_gl_depth_func(GL_ALWAYS);
|
|
scene_state.set_gl_cull_mode(RS::CULL_MODE_DISABLED);
|
|
scene_state.set_gl_cull_mode(RS::CULL_MODE_DISABLED);
|
|
|
|
|
|
// Loop through quadrants and copy shadows over.
|
|
// Loop through quadrants and copy shadows over.
|