فهرست منبع

Fix transparent background rendering, closes #8703
Properly implemented UPDATE_WHEN_VISIBLE mode for viewports

Juan Linietsky 8 سال پیش
والد
کامیت
9757fc354c

+ 4 - 0
drivers/gles3/rasterizer_scene_gles3.cpp

@@ -1227,6 +1227,8 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m
 				t->detect_normal(t->detect_normal_ud);
 			}
 #endif
+			if (t->render_target)
+				t->render_target->used_in_frame = true;
 
 			if (storage->config.srgb_decode_supported) {
 				//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;
 	} else if (!probe && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
 		clear_color = Color(0, 0, 0, 0);
+		storage->frame.clear_request = false;
+
 	} else if (!env || env->bg_mode == VS::ENV_BG_CLEAR_COLOR) {
 
 		if (storage->frame.clear_request) {

+ 12 - 2
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -6060,10 +6060,20 @@ void RasterizerStorageGLES3::render_target_set_flag(RID p_render_target, RenderT
 		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) {

+ 2 - 1
drivers/gles3/rasterizer_storage_gles3.h

@@ -1273,7 +1273,8 @@ public:
 	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 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);
 
 	/* CANVAS SHADOW */

+ 2 - 1
servers/visual/rasterizer.h

@@ -484,7 +484,8 @@ public:
 	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 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;
 
 	/* CANVAS SHADOW */

+ 3 - 1
servers/visual/visual_server_viewport.cpp

@@ -266,11 +266,13 @@ void VisualServerViewport::draw_viewports() {
 
 		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)
 			continue;
 
+		VSG::storage->render_target_clear_used(vp->render_target);
+
 		VSG::rasterizer->set_current_render_target(vp->render_target);
 
 		VSG::scene_render->set_debug_draw_mode(vp->debug_draw);

+ 0 - 3
servers/visual/visual_server_viewport.h

@@ -69,8 +69,6 @@ public:
 
 		VS::ViewportClearMode clear_mode;
 
-		bool rendered_in_prev_frame;
-
 		struct CanvasKey {
 
 			int layer;
@@ -100,7 +98,6 @@ public:
 		Viewport() {
 			update_mode = VS::VIEWPORT_UPDATE_WHEN_VISIBLE;
 			clear_mode = VS::VIEWPORT_CLEAR_ALWAYS;
-			rendered_in_prev_frame = false;
 			disable_environment = false;
 			viewport_to_screen = 0;
 			shadow_atlas_size = 0;