|
@@ -933,6 +933,15 @@ void RasterizerSceneGLES3::environment_set_tonemap(RID p_env, VS::EnvironmentTon
|
|
}
|
|
}
|
|
|
|
|
|
void RasterizerSceneGLES3::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, RID p_ramp) {
|
|
void RasterizerSceneGLES3::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, RID p_ramp) {
|
|
|
|
+
|
|
|
|
+ Environment *env = environment_owner.getornull(p_env);
|
|
|
|
+ ERR_FAIL_COND(!env);
|
|
|
|
+
|
|
|
|
+ env->adjustments_enabled = p_enable;
|
|
|
|
+ env->adjustments_brightness = p_brightness;
|
|
|
|
+ env->adjustments_contrast = p_contrast;
|
|
|
|
+ env->adjustments_saturation = p_saturation;
|
|
|
|
+ env->color_correction = p_ramp;
|
|
}
|
|
}
|
|
|
|
|
|
RID RasterizerSceneGLES3::light_instance_create(RID p_light) {
|
|
RID RasterizerSceneGLES3::light_instance_create(RID p_light) {
|
|
@@ -1697,7 +1706,7 @@ void RasterizerSceneGLES3::_setup_light(RenderList::Element *e, const Transform
|
|
|
|
|
|
GIProbeInstance *gipi = gi_probe_instance_owner.getptr(ridp[0]);
|
|
GIProbeInstance *gipi = gi_probe_instance_owner.getptr(ridp[0]);
|
|
|
|
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 10);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 9);
|
|
glBindTexture(GL_TEXTURE_3D, gipi->tex_cache);
|
|
glBindTexture(GL_TEXTURE_3D, gipi->tex_cache);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_XFORM1, gipi->transform_to_data * p_view_transform);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_XFORM1, gipi->transform_to_data * p_view_transform);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_BOUNDS1, gipi->bounds);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_BOUNDS1, gipi->bounds);
|
|
@@ -1709,7 +1718,7 @@ void RasterizerSceneGLES3::_setup_light(RenderList::Element *e, const Transform
|
|
|
|
|
|
GIProbeInstance *gipi2 = gi_probe_instance_owner.getptr(ridp[1]);
|
|
GIProbeInstance *gipi2 = gi_probe_instance_owner.getptr(ridp[1]);
|
|
|
|
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 11);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 10);
|
|
glBindTexture(GL_TEXTURE_3D, gipi2->tex_cache);
|
|
glBindTexture(GL_TEXTURE_3D, gipi2->tex_cache);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_XFORM2, gipi2->transform_to_data * p_view_transform);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_XFORM2, gipi2->transform_to_data * p_view_transform);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_BOUNDS2, gipi2->bounds);
|
|
state.scene_shader.set_uniform(SceneShaderGLES3::GI_PROBE_BOUNDS2, gipi2->bounds);
|
|
@@ -1751,8 +1760,6 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
|
|
|
if (!p_shadow && !p_directional_add) {
|
|
if (!p_shadow && !p_directional_add) {
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 2, state.env_radiance_ubo); //bind environment radiance info
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, 2, state.env_radiance_ubo); //bind environment radiance info
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, state.brdf_texture);
|
|
|
|
|
|
|
|
if (p_base_env) {
|
|
if (p_base_env) {
|
|
glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
|
|
glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
|
|
@@ -1934,7 +1941,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
|
|
|
|
|
if (skeleton.is_valid()) {
|
|
if (skeleton.is_valid()) {
|
|
RasterizerStorageGLES3::Skeleton *sk = storage->skeleton_owner.getornull(skeleton);
|
|
RasterizerStorageGLES3::Skeleton *sk = storage->skeleton_owner.getornull(skeleton);
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 6);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
|
|
glBindTexture(GL_TEXTURE_2D, sk->texture);
|
|
glBindTexture(GL_TEXTURE_2D, sk->texture);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2023,7 +2030,7 @@ void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geo
|
|
|
|
|
|
ERR_FAIL_COND(!m);
|
|
ERR_FAIL_COND(!m);
|
|
|
|
|
|
- bool has_base_alpha = (m->shader->spatial.uses_alpha);
|
|
|
|
|
|
+ bool has_base_alpha = (m->shader->spatial.uses_alpha || m->shader->spatial.uses_screen_texture);
|
|
bool has_blend_alpha = m->shader->spatial.blend_mode != RasterizerStorageGLES3::Shader::Spatial::BLEND_MODE_MIX || m->shader->spatial.ontop;
|
|
bool has_blend_alpha = m->shader->spatial.blend_mode != RasterizerStorageGLES3::Shader::Spatial::BLEND_MODE_MIX || m->shader->spatial.ontop;
|
|
bool has_alpha = has_base_alpha || has_blend_alpha;
|
|
bool has_alpha = has_base_alpha || has_blend_alpha;
|
|
bool shadow = false;
|
|
bool shadow = false;
|
|
@@ -2038,6 +2045,10 @@ void RasterizerSceneGLES3::_add_geometry(RasterizerStorageGLES3::Geometry *p_geo
|
|
state.used_sss = true;
|
|
state.used_sss = true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (m->shader->spatial.uses_screen_texture) {
|
|
|
|
+ state.used_screen_texture = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (p_shadow) {
|
|
if (p_shadow) {
|
|
|
|
|
|
if (has_blend_alpha || (has_base_alpha && m->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS))
|
|
if (has_blend_alpha || (has_base_alpha && m->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS))
|
|
@@ -2797,6 +2808,7 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p
|
|
current_geometry_index = 0;
|
|
current_geometry_index = 0;
|
|
current_material_index = 0;
|
|
current_material_index = 0;
|
|
state.used_sss = false;
|
|
state.used_sss = false;
|
|
|
|
+ state.used_screen_texture = false;
|
|
|
|
|
|
//fill list
|
|
//fill list
|
|
|
|
|
|
@@ -2874,6 +2886,39 @@ void RasterizerSceneGLES3::_fill_render_list(InstanceBase **p_cull_result, int p
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void RasterizerSceneGLES3::_blur_effect_buffer() {
|
|
|
|
+
|
|
|
|
+ //blur diffuse into effect mipmaps using separatable convolution
|
|
|
|
+ //storage->shaders.copy.set_conditional(CopyShaderGLES3::GAUSSIAN_HORIZONTAL,true);
|
|
|
|
+ for (int i = 0; i < storage->frame.current_rt->effects.mip_maps[1].sizes.size(); i++) {
|
|
|
|
+
|
|
|
|
+ int vp_w = storage->frame.current_rt->effects.mip_maps[1].sizes[i].width;
|
|
|
|
+ int vp_h = storage->frame.current_rt->effects.mip_maps[1].sizes[i].height;
|
|
|
|
+ glViewport(0, 0, vp_w, vp_h);
|
|
|
|
+ //horizontal pass
|
|
|
|
+ state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, true);
|
|
|
|
+ state.effect_blur_shader.bind();
|
|
|
|
+ state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
|
|
|
|
+ state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
|
|
|
|
+ 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();
|
|
|
|
+ state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, false);
|
|
|
|
+
|
|
|
|
+ //vertical pass
|
|
|
|
+ state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, true);
|
|
|
|
+ state.effect_blur_shader.bind();
|
|
|
|
+ state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
|
|
|
|
+ state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
|
|
|
|
+ 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();
|
|
|
|
+ state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, false);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_cam_projection) {
|
|
void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_cam_projection) {
|
|
|
|
|
|
glDepthMask(GL_FALSE);
|
|
glDepthMask(GL_FALSE);
|
|
@@ -3080,33 +3125,7 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
|
|
|
//blur diffuse into effect mipmaps using separatable convolution
|
|
//blur diffuse into effect mipmaps using separatable convolution
|
|
//storage->shaders.copy.set_conditional(CopyShaderGLES3::GAUSSIAN_HORIZONTAL,true);
|
|
//storage->shaders.copy.set_conditional(CopyShaderGLES3::GAUSSIAN_HORIZONTAL,true);
|
|
- for (int i = 0; i < storage->frame.current_rt->effects.mip_maps[1].sizes.size(); i++) {
|
|
|
|
-
|
|
|
|
- int vp_w = storage->frame.current_rt->effects.mip_maps[1].sizes[i].width;
|
|
|
|
- int vp_h = storage->frame.current_rt->effects.mip_maps[1].sizes[i].height;
|
|
|
|
- glViewport(0, 0, vp_w, vp_h);
|
|
|
|
- //horizontal pass
|
|
|
|
- state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, true);
|
|
|
|
- state.effect_blur_shader.bind();
|
|
|
|
- state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
|
|
|
|
- state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
|
|
|
|
- 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();
|
|
|
|
- state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, false);
|
|
|
|
-
|
|
|
|
- //vertical pass
|
|
|
|
- state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, true);
|
|
|
|
- state.effect_blur_shader.bind();
|
|
|
|
- state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
|
|
|
|
- state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
|
|
|
|
- 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();
|
|
|
|
- state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, false);
|
|
|
|
- }
|
|
|
|
|
|
+ _blur_effect_buffer();
|
|
|
|
|
|
//perform SSR
|
|
//perform SSR
|
|
|
|
|
|
@@ -3177,6 +3196,13 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_
|
|
|
|
|
|
glDisable(GL_BLEND); //end additive
|
|
glDisable(GL_BLEND); //end additive
|
|
|
|
|
|
|
|
+ if (state.used_screen_texture) {
|
|
|
|
+ _blur_effect_buffer();
|
|
|
|
+ //restored framebuffer
|
|
|
|
+ glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo);
|
|
|
|
+ glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height);
|
|
|
|
+ }
|
|
|
|
+
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::SIMPLE_COPY, true);
|
|
state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::SIMPLE_COPY, true);
|
|
state.effect_blur_shader.bind();
|
|
state.effect_blur_shader.bind();
|
|
state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(0));
|
|
state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(0));
|
|
@@ -3594,6 +3620,17 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (env->adjustments_enabled) {
|
|
|
|
+
|
|
|
|
+ state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_BCS, true);
|
|
|
|
+ RasterizerStorageGLES3::Texture *tex = storage->texture_owner.getornull(env->color_correction);
|
|
|
|
+ if (tex) {
|
|
|
|
+ state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_COLOR_CORRECTION, true);
|
|
|
|
+ glActiveTexture(GL_TEXTURE3);
|
|
|
|
+ glBindTexture(tex->target, tex->tex_id);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
state.tonemap_shader.bind();
|
|
state.tonemap_shader.bind();
|
|
|
|
|
|
state.tonemap_shader.set_uniform(TonemapShaderGLES3::EXPOSURE, env->tone_mapper_exposure);
|
|
state.tonemap_shader.set_uniform(TonemapShaderGLES3::EXPOSURE, env->tone_mapper_exposure);
|
|
@@ -3616,6 +3653,11 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
state.tonemap_shader.set_uniform(TonemapShaderGLES3::AUTO_EXPOSURE_GREY, env->auto_exposure_grey);
|
|
state.tonemap_shader.set_uniform(TonemapShaderGLES3::AUTO_EXPOSURE_GREY, env->auto_exposure_grey);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (env->adjustments_enabled) {
|
|
|
|
+
|
|
|
|
+ state.tonemap_shader.set_uniform(TonemapShaderGLES3::BCS, Vector3(env->adjustments_brightness, env->adjustments_contrast, env->adjustments_saturation));
|
|
|
|
+ }
|
|
|
|
+
|
|
_copy_screen();
|
|
_copy_screen();
|
|
|
|
|
|
//turn off everything used
|
|
//turn off everything used
|
|
@@ -3634,6 +3676,8 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_SCREEN, false);
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_SCREEN, false);
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_SOFTLIGHT, false);
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_SOFTLIGHT, false);
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_FILTER_BICUBIC, false);
|
|
state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_GLOW_FILTER_BICUBIC, false);
|
|
|
|
+ state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_BCS, false);
|
|
|
|
+ state.tonemap_shader.set_conditional(TonemapShaderGLES3::USE_COLOR_CORRECTION, false);
|
|
}
|
|
}
|
|
|
|
|
|
void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID p_environment, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) {
|
|
void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID p_environment, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) {
|
|
@@ -3648,7 +3692,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
ReflectionAtlas *reflection_atlas = reflection_atlas_owner.getornull(p_reflection_atlas);
|
|
ReflectionAtlas *reflection_atlas = reflection_atlas_owner.getornull(p_reflection_atlas);
|
|
|
|
|
|
if (shadow_atlas && shadow_atlas->size) {
|
|
if (shadow_atlas && shadow_atlas->size) {
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
|
|
glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
|
|
glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
|
|
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_LESS);
|
|
@@ -3657,7 +3701,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
}
|
|
}
|
|
|
|
|
|
if (reflection_atlas && reflection_atlas->size) {
|
|
if (reflection_atlas && reflection_atlas->size) {
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3);
|
|
glBindTexture(GL_TEXTURE_2D, reflection_atlas->color);
|
|
glBindTexture(GL_TEXTURE_2D, reflection_atlas->color);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3721,7 +3765,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
|
//bind depth for read
|
|
//bind depth for read
|
|
- glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 9);
|
|
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 8);
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->depth);
|
|
glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->depth);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3774,7 +3818,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- use_mrt = env && (state.used_sss || env->ssao_enabled || env->ssr_enabled); //only enable MRT rendering if any of these is enabled
|
|
|
|
|
|
+ use_mrt = env && (state.used_screen_texture || state.used_sss || env->ssao_enabled || env->ssr_enabled); //only enable MRT rendering if any of these is enabled
|
|
|
|
|
|
glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height);
|
|
glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height);
|
|
|
|
|
|
@@ -3910,6 +3954,11 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|
_render_mrts(env, p_cam_projection);
|
|
_render_mrts(env, p_cam_projection);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (state.used_screen_texture) {
|
|
|
|
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 7);
|
|
|
|
+ glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
|
|
|
|
+ }
|
|
|
|
+
|
|
glEnable(GL_BLEND);
|
|
glEnable(GL_BLEND);
|
|
glDepthMask(GL_TRUE);
|
|
glDepthMask(GL_TRUE);
|
|
glEnable(GL_DEPTH_TEST);
|
|
glEnable(GL_DEPTH_TEST);
|