diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 083ade50c3b..3c079cc8b7a 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -3493,12 +3493,16 @@ void TextureStorage::update_decal_buffer(const PagedArray &p_decals, const /* RENDER TARGET API */ RID TextureStorage::RenderTarget::get_framebuffer() { - // Note that if we're using an overridden color buffer, we're likely cycling through a texture chain. - // this is where our framebuffer cache comes in clutch.. + // We can't resolve into our overridden buffer as it won't be marked as a resolve buffer. + // This is only applicable when OpenXR is used and 2D rendering is skipped. - if (msaa != RS::VIEWPORT_MSAA_DISABLED) { - return FramebufferCacheRD::get_singleton()->get_cache_multiview(view_count, color_multisample, overridden.color.is_valid() ? overridden.color : color); + if (msaa != RS::VIEWPORT_MSAA_DISABLED && overridden.color.is_null()) { + // Render into our MSAA buffer and resolve into our color buffer. + return FramebufferCacheRD::get_singleton()->get_cache_multiview(view_count, color_multisample, color); } else { + // Note that if we're using an overridden color buffer, we're likely cycling through a texture chain. + // this is where our framebuffer cache comes in clutch.. + return FramebufferCacheRD::get_singleton()->get_cache_multiview(view_count, overridden.color.is_valid() ? overridden.color : color); } }