diff --git a/source/renderer/SceneRenderer.cpp b/source/renderer/SceneRenderer.cpp index 64f7ce2088..8c1f8657c2 100644 --- a/source/renderer/SceneRenderer.cpp +++ b/source/renderer/SceneRenderer.cpp @@ -564,6 +564,12 @@ void CSceneRenderer::RenderReflections( m->terrainRenderer.ScissorWater(CULL_DEFAULT, m_ViewCamera); if (reflectionScissor.IsEmpty()) { + if (!wm.m_ReflectionFramebufferInitialized) + { + wm.m_ReflectionFramebufferInitialized = true; + deviceCommandContext->BeginFramebufferPass(wm.m_ReflectionFramebuffer.get()); + deviceCommandContext->EndFramebufferPass(); + } m_ViewCamera = normalCamera; return; } @@ -619,6 +625,8 @@ void CSceneRenderer::RenderReflections( deviceCommandContext->SetScissors(0, nullptr); deviceCommandContext->EndFramebufferPass(); + wm.m_ReflectionFramebufferInitialized = true; + // Reset old camera m_ViewCamera = normalCamera; } @@ -641,6 +649,12 @@ void CSceneRenderer::RenderRefractions( m->terrainRenderer.ScissorWater(CULL_DEFAULT, m_ViewCamera); if (refractionScissor.IsEmpty()) { + if (!wm.m_RefractionFramebufferInitialized) + { + wm.m_RefractionFramebufferInitialized = true; + deviceCommandContext->BeginFramebufferPass(wm.m_ReflectionFramebuffer.get()); + deviceCommandContext->EndFramebufferPass(); + } m_ViewCamera = normalCamera; return; } @@ -697,6 +711,8 @@ void CSceneRenderer::RenderRefractions( deviceCommandContext->SetScissors(0, nullptr); deviceCommandContext->EndFramebufferPass(); + wm.m_RefractionFramebufferInitialized = true; + // Reset old camera m_ViewCamera = normalCamera; } diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp index 1bfde5480f..aaf563de4b 100644 --- a/source/renderer/WaterManager.cpp +++ b/source/renderer/WaterManager.cpp @@ -300,6 +300,7 @@ void WaterManager::RecreateOrLoadTexturesIfNeeded() g_RenderingOptions.SetWaterReflection(false); UpdateQuality(); } + m_ReflectionFramebufferInitialized = false; } // Create refraction textures. @@ -342,6 +343,7 @@ void WaterManager::RecreateOrLoadTexturesIfNeeded() g_RenderingOptions.SetWaterRefraction(false); UpdateQuality(); } + m_RefractionFramebufferInitialized = false; } const float scale{g_Renderer.GetPostprocManager().IsEnabled() diff --git a/source/renderer/WaterManager.h b/source/renderer/WaterManager.h index 6b2b70eb34..f5d8eded5c 100644 --- a/source/renderer/WaterManager.h +++ b/source/renderer/WaterManager.h @@ -113,7 +113,9 @@ public: // framebuffer objects std::unique_ptr m_RefractionFramebuffer; + bool m_RefractionFramebufferInitialized{false}; std::unique_ptr m_ReflectionFramebuffer; + bool m_ReflectionFramebufferInitialized{false}; std::unique_ptr m_FancyEffectsFramebuffer; std::unique_ptr m_FancyEffectsOccludersFramebuffer;