From 38a6726a078dea04d9ef9ca0e2709c2ce97277dc Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Fri, 6 Jan 2023 19:11:47 +0000 Subject: [PATCH] Fixes shore waves rendering after 29368cf776. Tested By: phosit Differential Revision: https://code.wildfiregames.com/D4865 This was SVN commit r27375. --- source/renderer/PatchRData.cpp | 2 +- source/renderer/TerrainRenderer.cpp | 21 +++++++++++++-------- source/renderer/WaterManager.cpp | 29 ++++++++++++++++++++++++++--- source/renderer/WaterManager.h | 1 + 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/source/renderer/PatchRData.cpp b/source/renderer/PatchRData.cpp index bcc48de0e0..064b6173e7 100644 --- a/source/renderer/PatchRData.cpp +++ b/source/renderer/PatchRData.cpp @@ -190,7 +190,7 @@ Renderer::Backend::IVertexInputLayout* CPatchRData::GetWaterSurfaceVertexInputLa Renderer::Backend::IVertexInputLayout* CPatchRData::GetWaterShoreVertexInputLayout() { const uint32_t stride = sizeof(SWaterVertex); - const std::array attributes{ { + const std::array attributes{{ {Renderer::Backend::VertexAttributeStream::POSITION, Renderer::Backend::Format::R32G32B32_SFLOAT, offsetof(SWaterVertex, m_Position), stride, diff --git a/source/renderer/TerrainRenderer.cpp b/source/renderer/TerrainRenderer.cpp index 2def274c5f..5d918128f2 100644 --- a/source/renderer/TerrainRenderer.cpp +++ b/source/renderer/TerrainRenderer.cpp @@ -733,18 +733,23 @@ void TerrainRenderer::RenderWaterFoamOccluders( if (!m->shaderTechniqueSolidDepthTest) { m->shaderTechniqueSolidDepthTest = g_Renderer.GetShaderManager().LoadEffect( - str_solid, {}, - [](Renderer::Backend::SGraphicsPipelineStateDesc& pipelineStateDesc) - { - pipelineStateDesc.depthStencilState.depthTestEnabled = true; - pipelineStateDesc.rasterizationState.cullMode = Renderer::Backend::CullMode::NONE; - }); + str_solid, {}, + [](Renderer::Backend::SGraphicsPipelineStateDesc& pipelineStateDesc) + { + pipelineStateDesc.depthStencilState.depthTestEnabled = true; + pipelineStateDesc.rasterizationState.cullMode = Renderer::Backend::CullMode::NONE; + }); } GPU_SCOPED_LABEL(deviceCommandContext, "Render water foam occluders"); - // Render normals and foam to a framebuffer if we're using fancy effects. - deviceCommandContext->BeginFramebufferPass(waterManager.m_FancyEffectsFramebuffer.get()); + Renderer::Backend::IFramebuffer* framebuffer = + waterManager.m_FancyEffectsOccludersFramebuffer.get(); + deviceCommandContext->BeginFramebufferPass(framebuffer); + Renderer::Backend::IDeviceCommandContext::Rect viewportRect{}; + viewportRect.width = framebuffer->GetWidth(); + viewportRect.height = framebuffer->GetHeight(); + deviceCommandContext->SetViewports(1, &viewportRect); // Overwrite waves that would be behind the ground. deviceCommandContext->SetGraphicsPipelineState( diff --git a/source/renderer/WaterManager.cpp b/source/renderer/WaterManager.cpp index 717ea9dc01..f39f10ff75 100644 --- a/source/renderer/WaterManager.cpp +++ b/source/renderer/WaterManager.cpp @@ -119,6 +119,7 @@ WaterManager::~WaterManager() m_WindStrength.reset(); m_FancyEffectsFramebuffer.reset(); + m_FancyEffectsOccludersFramebuffer.reset(); m_RefractionFramebuffer.reset(); m_ReflectionFramebuffer.reset(); @@ -323,6 +324,7 @@ void WaterManager::RecreateOrLoadTexturesIfNeeded() if (m_FancyTexture && (m_FancyTexture->GetWidth() != newWidth || m_FancyTexture->GetHeight() != newHeight)) { m_FancyEffectsFramebuffer.reset(); + m_FancyEffectsOccludersFramebuffer.reset(); m_FancyTexture.reset(); m_FancyTextureDepth.reset(); } @@ -357,11 +359,26 @@ void WaterManager::RecreateOrLoadTexturesIfNeeded() Renderer::Backend::SDepthStencilAttachment depthStencilAttachment{}; depthStencilAttachment.texture = m_FancyTextureDepth.get(); depthStencilAttachment.loadOp = Renderer::Backend::AttachmentLoadOp::CLEAR; - depthStencilAttachment.storeOp = Renderer::Backend::AttachmentStoreOp::DONT_CARE; + // We need to store depth for later rendering occluders. + depthStencilAttachment.storeOp = Renderer::Backend::AttachmentStoreOp::STORE; m_FancyEffectsFramebuffer = backendDevice->CreateFramebuffer("FancyEffectsFramebuffer", &colorAttachment, &depthStencilAttachment); - if (!m_FancyEffectsFramebuffer) + + Renderer::Backend::SColorAttachment occludersColorAttachment{}; + occludersColorAttachment.texture = m_FancyTexture.get(); + occludersColorAttachment.loadOp = Renderer::Backend::AttachmentLoadOp::LOAD; + occludersColorAttachment.storeOp = Renderer::Backend::AttachmentStoreOp::STORE; + occludersColorAttachment.clearColor = CColor{0.0f, 0.0f, 0.0f, 0.0f}; + + Renderer::Backend::SDepthStencilAttachment occludersDepthStencilAttachment{}; + occludersDepthStencilAttachment.texture = m_FancyTextureDepth.get(); + occludersDepthStencilAttachment.loadOp = Renderer::Backend::AttachmentLoadOp::LOAD; + occludersDepthStencilAttachment.storeOp = Renderer::Backend::AttachmentStoreOp::DONT_CARE; + + m_FancyEffectsOccludersFramebuffer = backendDevice->CreateFramebuffer("FancyEffectsOccludersFramebuffer", + &occludersColorAttachment, &occludersDepthStencilAttachment); + if (!m_FancyEffectsFramebuffer || !m_FancyEffectsOccludersFramebuffer) { g_RenderingOptions.SetWaterRefraction(false); UpdateQuality(); @@ -873,7 +890,13 @@ void WaterManager::RenderWaves( GPU_SCOPED_LABEL(deviceCommandContext, "Render Waves"); - deviceCommandContext->BeginFramebufferPass(m_FancyEffectsFramebuffer.get()); + Renderer::Backend::IFramebuffer* framebuffer = + m_FancyEffectsFramebuffer.get(); + deviceCommandContext->BeginFramebufferPass(framebuffer); + Renderer::Backend::IDeviceCommandContext::Rect viewportRect{}; + viewportRect.width = framebuffer->GetWidth(); + viewportRect.height = framebuffer->GetHeight(); + deviceCommandContext->SetViewports(1, &viewportRect); CShaderTechniquePtr tech = g_Renderer.GetShaderManager().LoadEffect(str_water_waves); deviceCommandContext->SetGraphicsPipelineState( diff --git a/source/renderer/WaterManager.h b/source/renderer/WaterManager.h index ba642db475..a61c362282 100644 --- a/source/renderer/WaterManager.h +++ b/source/renderer/WaterManager.h @@ -112,6 +112,7 @@ public: std::unique_ptr m_RefractionFramebuffer; std::unique_ptr m_ReflectionFramebuffer; std::unique_ptr m_FancyEffectsFramebuffer; + std::unique_ptr m_FancyEffectsOccludersFramebuffer; // Model-view-projection matrices for reflected & refracted cameras // (used to let the vertex shader do projective texturing)