Fix transparent background rendering, closes #8703
Properly implemented UPDATE_WHEN_VISIBLE mode for viewports
This commit is contained in:
parent
569a2b5bd7
commit
9757fc354c
@ -1227,6 +1227,8 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m
|
|||||||
t->detect_normal(t->detect_normal_ud);
|
t->detect_normal(t->detect_normal_ud);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (t->render_target)
|
||||||
|
t->render_target->used_in_frame = true;
|
||||||
|
|
||||||
if (storage->config.srgb_decode_supported) {
|
if (storage->config.srgb_decode_supported) {
|
||||||
//if SRGB decode extension is present, simply switch the texture to whathever is needed
|
//if SRGB decode extension is present, simply switch the texture to whathever is needed
|
||||||
@ -4008,6 +4010,8 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
|
|||||||
storage->frame.clear_request = false;
|
storage->frame.clear_request = false;
|
||||||
} else if (!probe && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
|
} else if (!probe && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
|
||||||
clear_color = Color(0, 0, 0, 0);
|
clear_color = Color(0, 0, 0, 0);
|
||||||
|
storage->frame.clear_request = false;
|
||||||
|
|
||||||
} else if (!env || env->bg_mode == VS::ENV_BG_CLEAR_COLOR) {
|
} else if (!env || env->bg_mode == VS::ENV_BG_CLEAR_COLOR) {
|
||||||
|
|
||||||
if (storage->frame.clear_request) {
|
if (storage->frame.clear_request) {
|
||||||
|
@ -6060,10 +6060,20 @@ void RasterizerStorageGLES3::render_target_set_flag(RID p_render_target, RenderT
|
|||||||
default: {}
|
default: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool RasterizerStorageGLES3::render_target_was_used(RID p_render_target) {
|
||||||
|
|
||||||
bool RasterizerStorageGLES3::render_target_renedered_in_frame(RID p_render_target) {
|
RenderTarget *rt = render_target_owner.getornull(p_render_target);
|
||||||
|
ERR_FAIL_COND_V(!rt, false);
|
||||||
|
|
||||||
return false;
|
return rt->used_in_frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RasterizerStorageGLES3::render_target_clear_used(RID p_render_target) {
|
||||||
|
|
||||||
|
RenderTarget *rt = render_target_owner.getornull(p_render_target);
|
||||||
|
ERR_FAIL_COND(!rt);
|
||||||
|
|
||||||
|
rt->used_in_frame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerStorageGLES3::render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa) {
|
void RasterizerStorageGLES3::render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa) {
|
||||||
|
@ -1273,7 +1273,8 @@ public:
|
|||||||
virtual RID render_target_get_texture(RID p_render_target) const;
|
virtual RID render_target_get_texture(RID p_render_target) const;
|
||||||
|
|
||||||
virtual void render_target_set_flag(RID p_render_target, RenderTargetFlags p_flag, bool p_value);
|
virtual void render_target_set_flag(RID p_render_target, RenderTargetFlags p_flag, bool p_value);
|
||||||
virtual bool render_target_renedered_in_frame(RID p_render_target);
|
virtual bool render_target_was_used(RID p_render_target);
|
||||||
|
virtual void render_target_clear_used(RID p_render_target);
|
||||||
virtual void render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa);
|
virtual void render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa);
|
||||||
|
|
||||||
/* CANVAS SHADOW */
|
/* CANVAS SHADOW */
|
||||||
|
@ -484,7 +484,8 @@ public:
|
|||||||
virtual void render_target_set_size(RID p_render_target, int p_width, int p_height) = 0;
|
virtual void render_target_set_size(RID p_render_target, int p_width, int p_height) = 0;
|
||||||
virtual RID render_target_get_texture(RID p_render_target) const = 0;
|
virtual RID render_target_get_texture(RID p_render_target) const = 0;
|
||||||
virtual void render_target_set_flag(RID p_render_target, RenderTargetFlags p_flag, bool p_value) = 0;
|
virtual void render_target_set_flag(RID p_render_target, RenderTargetFlags p_flag, bool p_value) = 0;
|
||||||
virtual bool render_target_renedered_in_frame(RID p_render_target) = 0;
|
virtual bool render_target_was_used(RID p_render_target) = 0;
|
||||||
|
virtual void render_target_clear_used(RID p_render_target) = 0;
|
||||||
virtual void render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa) = 0;
|
virtual void render_target_set_msaa(RID p_render_target, VS::ViewportMSAA p_msaa) = 0;
|
||||||
|
|
||||||
/* CANVAS SHADOW */
|
/* CANVAS SHADOW */
|
||||||
|
@ -266,11 +266,13 @@ void VisualServerViewport::draw_viewports() {
|
|||||||
|
|
||||||
ERR_CONTINUE(!vp->render_target.is_valid());
|
ERR_CONTINUE(!vp->render_target.is_valid());
|
||||||
|
|
||||||
bool visible = vp->viewport_to_screen_rect != Rect2() || vp->update_mode == VS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == VS::VIEWPORT_UPDATE_ONCE;
|
bool visible = vp->viewport_to_screen_rect != Rect2() || vp->update_mode == VS::VIEWPORT_UPDATE_ALWAYS || vp->update_mode == VS::VIEWPORT_UPDATE_ONCE || (vp->update_mode == VS::VIEWPORT_UPDATE_WHEN_VISIBLE && VSG::storage->render_target_was_used(vp->render_target));
|
||||||
|
|
||||||
if (!visible)
|
if (!visible)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
VSG::storage->render_target_clear_used(vp->render_target);
|
||||||
|
|
||||||
VSG::rasterizer->set_current_render_target(vp->render_target);
|
VSG::rasterizer->set_current_render_target(vp->render_target);
|
||||||
|
|
||||||
VSG::scene_render->set_debug_draw_mode(vp->debug_draw);
|
VSG::scene_render->set_debug_draw_mode(vp->debug_draw);
|
||||||
|
@ -69,8 +69,6 @@ public:
|
|||||||
|
|
||||||
VS::ViewportClearMode clear_mode;
|
VS::ViewportClearMode clear_mode;
|
||||||
|
|
||||||
bool rendered_in_prev_frame;
|
|
||||||
|
|
||||||
struct CanvasKey {
|
struct CanvasKey {
|
||||||
|
|
||||||
int layer;
|
int layer;
|
||||||
@ -100,7 +98,6 @@ public:
|
|||||||
Viewport() {
|
Viewport() {
|
||||||
update_mode = VS::VIEWPORT_UPDATE_WHEN_VISIBLE;
|
update_mode = VS::VIEWPORT_UPDATE_WHEN_VISIBLE;
|
||||||
clear_mode = VS::VIEWPORT_CLEAR_ALWAYS;
|
clear_mode = VS::VIEWPORT_CLEAR_ALWAYS;
|
||||||
rendered_in_prev_frame = false;
|
|
||||||
disable_environment = false;
|
disable_environment = false;
|
||||||
viewport_to_screen = 0;
|
viewport_to_screen = 0;
|
||||||
shadow_atlas_size = 0;
|
shadow_atlas_size = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user