Bläddra i källkod

Merge pull request #33444 from BastiaanOlij/external_msaa

Make MSAA in GLES2 work with external textures for VR
Rémi Verschelde 5 år sedan
förälder
incheckning
28294b1f19

+ 13 - 7
drivers/gles2/rasterizer_scene_gles2.cpp

@@ -2767,6 +2767,8 @@ void RasterizerSceneGLES2::_post_process(Environment *env, const CameraMatrix &p
 
 
 	if (use_post_process) {
 	if (use_post_process) {
 		next_buffer = storage->frame.current_rt->mip_maps[0].sizes[0].fbo;
 		next_buffer = storage->frame.current_rt->mip_maps[0].sizes[0].fbo;
+	} else if (storage->frame.current_rt->external.fbo != 0) {
+		next_buffer = storage->frame.current_rt->external.fbo;
 	} else {
 	} else {
 		// set next_buffer to front buffer so multisample blit can happen if needed
 		// set next_buffer to front buffer so multisample blit can happen if needed
 		next_buffer = storage->frame.current_rt->fbo;
 		next_buffer = storage->frame.current_rt->fbo;
@@ -2795,9 +2797,15 @@ void RasterizerSceneGLES2::_post_process(Environment *env, const CameraMatrix &p
 
 
 		// In GLES2 Android Blit is not available, so just copy color texture manually
 		// In GLES2 Android Blit is not available, so just copy color texture manually
 		_copy_texture_to_buffer(storage->frame.current_rt->multisample_color, next_buffer);
 		_copy_texture_to_buffer(storage->frame.current_rt->multisample_color, next_buffer);
+#else
+		// TODO: any other platform not supported? this will fail.. maybe we should just call _copy_texture_to_buffer here as well?
 #endif
 #endif
 	} else if (use_post_process) {
 	} else if (use_post_process) {
-		_copy_texture_to_buffer(storage->frame.current_rt->color, storage->frame.current_rt->mip_maps[0].sizes[0].fbo);
+		if (storage->frame.current_rt->external.fbo != 0) {
+			_copy_texture_to_buffer(storage->frame.current_rt->external.color, storage->frame.current_rt->mip_maps[0].sizes[0].fbo);
+		} else {
+			_copy_texture_to_buffer(storage->frame.current_rt->color, storage->frame.current_rt->mip_maps[0].sizes[0].fbo);
+		}
 	}
 	}
 
 
 	if (!use_post_process) {
 	if (!use_post_process) {
@@ -3220,14 +3228,12 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
 
 
 	} else {
 	} else {
 		state.render_no_shadows = false;
 		state.render_no_shadows = false;
-		if (storage->frame.current_rt->external.fbo != 0) {
+		if (storage->frame.current_rt->multisample_active) {
+			current_fb = storage->frame.current_rt->multisample_fbo;
+		} else if (storage->frame.current_rt->external.fbo != 0) {
 			current_fb = storage->frame.current_rt->external.fbo;
 			current_fb = storage->frame.current_rt->external.fbo;
 		} else {
 		} else {
-			if (storage->frame.current_rt->multisample_active) {
-				current_fb = storage->frame.current_rt->multisample_fbo;
-			} else {
-				current_fb = storage->frame.current_rt->fbo;
-			}
+			current_fb = storage->frame.current_rt->fbo;
 		}
 		}
 		env = environment_owner.getornull(p_environment);
 		env = environment_owner.getornull(p_environment);
 
 

+ 7 - 19
drivers/gles2/rasterizer_storage_gles2.cpp

@@ -5156,26 +5156,14 @@ void RasterizerStorageGLES2::render_target_set_external_texture(RID p_render_tar
 
 
 		// is there a point to setting the internal formats? we don't know them..
 		// is there a point to setting the internal formats? we don't know them..
 
 
-		// check if MSAA is active to set the correct depth buffer and target texture for android
-		if (rt->multisample_active) {
-#if defined(GLES_OVER_GL) || defined(IPHONE_ENABLED)
-			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, p_texture_id);
-#elif ANDROID_ENABLED
-			static const int msaa_value[] = { 0, 2, 4, 8, 16 };
-			int msaa = msaa_value[rt->msaa];
-			glFramebufferTexture2DMultisample(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_texture_id, 0, msaa);
-#endif
-			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->multisample_depth);
-		} else {
-			// set our texture as the destination for our framebuffer
-			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_texture_id, 0);
+		// set our texture as the destination for our framebuffer
+		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_texture_id, 0);
 
 
-			// seeing we're rendering into this directly, better also use our depth buffer, just use our existing one :)
-			if (config.support_depth_texture) {
-				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
-			} else {
-				glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
-			}
+		// seeing we're rendering into this directly, better also use our depth buffer, just use our existing one :)
+		if (config.support_depth_texture) {
+			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0);
+		} else {
+			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rt->depth);
 		}
 		}
 
 
 		// check status and unbind
 		// check status and unbind