|
@@ -2384,6 +2384,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
bool draw_sky = false;
|
|
bool draw_sky = false;
|
|
bool draw_sky_fog_only = false;
|
|
bool draw_sky_fog_only = false;
|
|
bool keep_color = false;
|
|
bool keep_color = false;
|
|
|
|
+ bool draw_canvas = false;
|
|
bool draw_feed = false;
|
|
bool draw_feed = false;
|
|
float sky_energy_multiplier = 1.0;
|
|
float sky_energy_multiplier = 1.0;
|
|
int camera_feed_id = -1;
|
|
int camera_feed_id = -1;
|
|
@@ -2425,7 +2426,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
draw_sky = !render_data.transparent_bg;
|
|
draw_sky = !render_data.transparent_bg;
|
|
} break;
|
|
} break;
|
|
case RS::ENV_BG_CANVAS: {
|
|
case RS::ENV_BG_CANVAS: {
|
|
- keep_color = true;
|
|
|
|
|
|
+ draw_canvas = true;
|
|
} break;
|
|
} break;
|
|
case RS::ENV_BG_KEEP: {
|
|
case RS::ENV_BG_KEEP: {
|
|
keep_color = true;
|
|
keep_color = true;
|
|
@@ -2433,6 +2434,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
case RS::ENV_BG_CAMERA_FEED: {
|
|
case RS::ENV_BG_CAMERA_FEED: {
|
|
camera_feed_id = environment_get_camera_feed_id(render_data.environment);
|
|
camera_feed_id = environment_get_camera_feed_id(render_data.environment);
|
|
draw_feed = true;
|
|
draw_feed = true;
|
|
|
|
+ keep_color = true;
|
|
} break;
|
|
} break;
|
|
default: {
|
|
default: {
|
|
}
|
|
}
|
|
@@ -2544,10 +2546,14 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
}
|
|
}
|
|
|
|
|
|
- if (!keep_color && !draw_feed) {
|
|
|
|
|
|
+ // Need to clear framebuffer unless:
|
|
|
|
+ // a) We explicitly request not to (i.e. ENV_BG_KEEP).
|
|
|
|
+ // b) We are rendering to a non-intermediate framebuffer with ENV_BG_CANVAS (shared between 2D and 3D).
|
|
|
|
+ if (!keep_color && (!draw_canvas || fbo != rt->fbo)) {
|
|
clear_color.a = render_data.transparent_bg ? 0.0f : 1.0f;
|
|
clear_color.a = render_data.transparent_bg ? 0.0f : 1.0f;
|
|
glClearBufferfv(GL_COLOR, 0, clear_color.components);
|
|
glClearBufferfv(GL_COLOR, 0, clear_color.components);
|
|
- } else if (fbo != rt->fbo) {
|
|
|
|
|
|
+ }
|
|
|
|
+ if ((keep_color || draw_canvas) && fbo != rt->fbo) {
|
|
// Need to copy our current contents to our intermediate/MSAA buffer
|
|
// Need to copy our current contents to our intermediate/MSAA buffer
|
|
GLES3::CopyEffects *copy_effects = GLES3::CopyEffects::get_singleton();
|
|
GLES3::CopyEffects *copy_effects = GLES3::CopyEffects::get_singleton();
|
|
|
|
|