|
@@ -521,13 +521,7 @@ void RasterizerSceneGLES3::reflection_atlas_set_size(RID p_ref_atlas, int p_size
|
|
|
glBindTexture(GL_TEXTURE_2D, reflection_atlas->color);
|
|
|
|
|
|
int mmsize = reflection_atlas->size;
|
|
|
-
|
|
|
- for (int i = 0; i < 6; i++) {
|
|
|
- glTexImage2D(GL_TEXTURE_2D, i, internal_format, mmsize, mmsize, 0,
|
|
|
- format, type, NULL);
|
|
|
-
|
|
|
- mmsize >>= 1;
|
|
|
- }
|
|
|
+ glTexStorage2DCustom(GL_TEXTURE_2D, 6, internal_format, mmsize, mmsize, format, type);
|
|
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
@@ -537,8 +531,6 @@ void RasterizerSceneGLES3::reflection_atlas_set_size(RID p_ref_atlas, int p_size
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5);
|
|
|
|
|
|
- mmsize = reflection_atlas->size;
|
|
|
-
|
|
|
for (int i = 0; i < 6; i++) {
|
|
|
glGenFramebuffers(1, &reflection_atlas->fbo[i]);
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, reflection_atlas->fbo[i]);
|
|
@@ -1962,6 +1954,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADELESS, true);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_FORWARD_LIGHTING, false);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_VERTEX_LIGHTING, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_LIGHT_DIRECTIONAL, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::LIGHT_DIRECTIONAL_SHADOW, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::LIGHT_USE_PSSM4, false);
|
|
@@ -1972,6 +1965,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADOW_MODE_PCF_13, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_GI_PROBES, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_RADIANCE_MAP, false);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_CONTACT_SHADOWS, false);
|
|
|
|
|
|
//state.scene_shader.set_conditional(SceneShaderGLES3::SHADELESS,true);
|
|
|
} else {
|
|
@@ -1979,7 +1973,10 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_GI_PROBES, e->instance->gi_probe_instances.size() > 0);
|
|
|
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADELESS, false);
|
|
|
+
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_FORWARD_LIGHTING, !p_directional_add);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_VERTEX_LIGHTING, (e->sort_key & SORT_KEY_VERTEX_LIT_FLAG));
|
|
|
+
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_LIGHT_DIRECTIONAL, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::LIGHT_DIRECTIONAL_SHADOW, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::LIGHT_USE_PSSM4, false);
|
|
@@ -1988,6 +1985,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADOW_MODE_PCF_5, shadow_filter_mode == SHADOW_FILTER_PCF5);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADOW_MODE_PCF_13, shadow_filter_mode == SHADOW_FILTER_PCF13);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_RADIANCE_MAP, use_radiance_map);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_CONTACT_SHADOWS, state.used_contact_shadows);
|
|
|
|
|
|
if (p_directional_add || (directional_light && (e->sort_key & SORT_KEY_NO_DIRECTIONAL_FLAG) == 0)) {
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_LIGHT_DIRECTIONAL, true);
|
|
@@ -2136,6 +2134,8 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADOW_MODE_PCF_5, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::SHADOW_MODE_PCF_13, false);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_GI_PROBES, false);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_CONTACT_SHADOWS, false);
|
|
|
+ state.scene_shader.set_conditional(SceneShaderGLES3::USE_VERTEX_LIGHTING, false);
|
|
|
}
|
|
|
|
|
|
void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, int p_material, bool p_shadow) {
|
|
@@ -2281,6 +2281,11 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G
|
|
|
|
|
|
e->sort_key |= SORT_KEY_UNSHADED_FLAG;
|
|
|
}
|
|
|
+
|
|
|
+ if (!shadow && (m->shader->spatial.uses_vertex_lighting || storage->config.force_vertex_shading)) {
|
|
|
+
|
|
|
+ e->sort_key |= SORT_KEY_VERTEX_LIT_FLAG;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_scale, float p_energy) {
|
|
@@ -2912,7 +2917,19 @@ void RasterizerSceneGLES3::_setup_reflections(RID *p_reflection_probe_cull_resul
|
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 6, state.reflection_array_ubo);
|
|
|
}
|
|
|
|
|
|
-void RasterizerSceneGLES3::_copy_screen() {
|
|
|
+void RasterizerSceneGLES3::_copy_screen(bool p_invalidate_color, bool p_invalidate_depth) {
|
|
|
+
|
|
|
+#ifndef GLES_OVER_GL
|
|
|
+ if (p_invalidate_color) {
|
|
|
+
|
|
|
+ GLenum attachments[2] = {
|
|
|
+ GL_COLOR_ATTACHMENT0,
|
|
|
+ GL_DEPTH_STENCIL_ATTACHMENT
|
|
|
+ };
|
|
|
+
|
|
|
+ glInvalidateFramebuffer(GL_FRAMEBUFFER, p_invalidate_depth ? 2 : 1, attachments);
|
|
|
+ }
|
|
|
+#endif
|
|
|
|
|
|
glBindVertexArray(storage->resources.quadie_array);
|
|
|
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
|
@@ -3080,7 +3097,7 @@ void RasterizerSceneGLES3::_blur_effect_buffer() {
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color); //previous level, since mipmaps[0] starts one level bigger
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[1].sizes[i].fbo);
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, false);
|
|
|
|
|
|
//vertical pass
|
|
@@ -3091,7 +3108,7 @@ void RasterizerSceneGLES3::_blur_effect_buffer() {
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[1].color);
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[i + 1].fbo); //next level, since mipmaps[0] starts one level bigger
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, false);
|
|
|
}
|
|
|
}
|
|
@@ -3139,7 +3156,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.ssao.depth_mipmap_fbos[i]); //copy to front first
|
|
|
glViewport(0, 0, ss[0], ss[1]);
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
}
|
|
|
ss[0] = storage->frame.current_rt->width;
|
|
|
ss[1] = storage->frame.current_rt->height;
|
|
@@ -3191,7 +3208,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
Color white(1, 1, 1, 1);
|
|
|
glClearBufferfv(GL_COLOR, 0, white.components); // specular
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
//do the batm, i mean blur
|
|
|
|
|
@@ -3212,7 +3229,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
if (i == 0) {
|
|
|
glClearBufferfv(GL_COLOR, 0, white.components); // specular
|
|
|
}
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3229,7 +3246,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
glActiveTexture(GL_TEXTURE1);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.ssao.blur_red[0]); //previous level, since mipmaps[0] starts one level bigger
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo); // copy to base level
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::SSAO_MERGE, false);
|
|
|
|
|
|
} else {
|
|
@@ -3278,14 +3295,14 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo); //copy to front first
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color);
|
|
|
state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::DIR, Vector2(0, 1));
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo); // copy to base level
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color); //restore filter
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
@@ -3337,7 +3354,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[1].sizes[0].fbo);
|
|
|
glViewport(0, 0, ssr_w, ssr_h);
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height);
|
|
|
}
|
|
|
|
|
@@ -3368,7 +3385,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
glBlendEquation(GL_FUNC_ADD);
|
|
|
glBlendFunc(GL_ONE, GL_ONE); //use additive to accumulate one over the other
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
glDisable(GL_BLEND); //end additive
|
|
|
|
|
@@ -3392,7 +3409,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::SIMPLE_COPY, false);
|
|
|
}
|
|
@@ -3413,13 +3430,16 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
//copy specular to front buffer
|
|
|
//copy diffuse to effect buffer
|
|
|
|
|
|
- glReadBuffer(GL_COLOR_ATTACHMENT0);
|
|
|
- glBindFramebuffer(GL_READ_FRAMEBUFFER, storage->frame.current_rt->buffers.fbo);
|
|
|
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo);
|
|
|
- glBlitFramebuffer(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height, 0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
|
|
+ if (storage->frame.current_rt->buffers.active) {
|
|
|
+ //transfer to effect buffer if using buffers, also resolve MSAA
|
|
|
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
|
|
|
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, storage->frame.current_rt->buffers.fbo);
|
|
|
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo);
|
|
|
+ glBlitFramebuffer(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height, 0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
|
|
|
|
|
- glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
|
|
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
|
|
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
|
|
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
|
|
+ }
|
|
|
|
|
|
if (!env || storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
|
|
|
//no environment or transparent render, simply return and convert to SRGB
|
|
@@ -3431,7 +3451,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, !storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]);
|
|
|
storage->shaders.copy.bind();
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
storage->shaders.copy.set_conditional(CopyShaderGLES3::LINEAR_TO_SRGB, false);
|
|
|
storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, false); //compute luminance
|
|
@@ -3487,7 +3507,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo); //copy to front first
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color);
|
|
@@ -3574,7 +3594,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->buffers.diffuse);
|
|
|
}
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
if (composite_from != storage->frame.current_rt->buffers.diffuse) {
|
|
|
|
|
@@ -3614,7 +3634,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, exposure_shrink[0].fbo);
|
|
|
glViewport(0, 0, exposure_shrink_size, exposure_shrink_size);
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
//second step, shrink to 2x2 pixels
|
|
|
state.exposure_shader.set_conditional(ExposureShaderGLES3::EXPOSURE_BEGIN, false);
|
|
@@ -3658,7 +3678,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
state.exposure_shader.set_uniform(ExposureShaderGLES3::MAX_LUMINANCE, env->auto_exposure_max);
|
|
|
state.exposure_shader.set_uniform(ExposureShaderGLES3::MIN_LUMINANCE, env->auto_exposure_min);
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
|
|
|
state.exposure_shader.set_conditional(ExposureShaderGLES3::EXPOSURE_FORCE_SET, false);
|
|
|
state.exposure_shader.set_conditional(ExposureShaderGLES3::EXPOSURE_END, false);
|
|
@@ -3729,7 +3749,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color); //previous level, since mipmaps[0] starts one level bigger
|
|
|
}
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[1].sizes[i].fbo);
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GLOW_GAUSSIAN_HORIZONTAL, false);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GLOW_FIRST_PASS, false);
|
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GLOW_USE_AUTO_EXPOSURE, false);
|
|
@@ -3837,7 +3857,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
|
state.tonemap_shader.set_uniform(TonemapShaderGLES3::BCS, Vector3(env->adjustments_brightness, env->adjustments_contrast, env->adjustments_saturation));
|
|
|
}
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true, true);
|
|
|
|
|
|
//turn off everything used
|
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_AUTO_EXPOSURE, false);
|
|
@@ -3913,7 +3933,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
state.used_contact_shadows = true;
|
|
|
|
|
|
- if (storage->frame.current_rt && state.debug_draw != VS::VIEWPORT_DEBUG_DRAW_OVERDRAW) { //detect with state.used_contact_shadows too
|
|
|
+ if (!storage->config.no_depth_prepass && storage->frame.current_rt && state.debug_draw != VS::VIEWPORT_DEBUG_DRAW_OVERDRAW) { //detect with state.used_contact_shadows too
|
|
|
//pre z pass
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
@@ -3927,7 +3947,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
glColorMask(0, 0, 0, 0);
|
|
|
glClearDepth(1.0f);
|
|
|
- glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
+ glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
|
|
|
|
|
render_list.clear();
|
|
|
_fill_render_list(p_cull_result, p_cull_count, true);
|
|
@@ -3953,6 +3973,9 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
fb_cleared = true;
|
|
|
render_pass++;
|
|
|
+ state.using_contact_shadows = true;
|
|
|
+ } else {
|
|
|
+ state.using_contact_shadows = false;
|
|
|
}
|
|
|
|
|
|
_setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_cam_projection, p_shadow_atlas);
|
|
@@ -4034,8 +4057,13 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- current_fbo = storage->frame.current_rt->buffers.fbo;
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->buffers.fbo);
|
|
|
+ if (storage->frame.current_rt->buffers.active) {
|
|
|
+ current_fbo = storage->frame.current_rt->buffers.fbo;
|
|
|
+ } else {
|
|
|
+ current_fbo = storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo;
|
|
|
+ }
|
|
|
+
|
|
|
+ glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);
|
|
|
state.scene_shader.set_conditional(SceneShaderGLES3::USE_MULTIPLE_RENDER_TARGETS, false);
|
|
|
|
|
|
Vector<GLenum> draw_buffers;
|
|
@@ -4045,8 +4073,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
}
|
|
|
|
|
|
if (!fb_cleared) {
|
|
|
- glClearDepth(1.0f);
|
|
|
- glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
+ glClearBufferfi(GL_DEPTH_STENCIL, 0, 1.0, 0);
|
|
|
}
|
|
|
|
|
|
Color clear_color(0, 0, 0, 0);
|
|
@@ -4111,7 +4138,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
storage->shaders.copy.bind();
|
|
|
|
|
|
- _copy_screen();
|
|
|
+ _copy_screen(true, true);
|
|
|
|
|
|
//turn off everything used
|
|
|
storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, false);
|
|
@@ -4178,7 +4205,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
_render_mrts(env, p_cam_projection);
|
|
|
} else {
|
|
|
//FIXME: check that this is possible to use
|
|
|
- if (storage->frame.current_rt && state.used_screen_texture) {
|
|
|
+ if (storage->frame.current_rt && storage->frame.current_rt->buffers.active && state.used_screen_texture) {
|
|
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, storage->frame.current_rt->buffers.fbo);
|
|
|
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
|
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo);
|
|
@@ -4192,7 +4219,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (storage->frame.current_rt && state.used_screen_texture) {
|
|
|
+ if (storage->frame.current_rt && state.used_screen_texture && storage->frame.current_rt->buffers.active) {
|
|
|
glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 7);
|
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
|
|
}
|
|
@@ -4273,6 +4300,8 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
}
|
|
|
+
|
|
|
+ //disable all stuff
|
|
|
}
|
|
|
|
|
|
void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_pass, InstanceBase **p_cull_result, int p_cull_count) {
|
|
@@ -4297,6 +4326,8 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_
|
|
|
float bias = 0;
|
|
|
float normal_bias = 0;
|
|
|
|
|
|
+ state.using_contact_shadows = false;
|
|
|
+
|
|
|
CameraMatrix light_projection;
|
|
|
Transform light_transform;
|
|
|
|