1
0
forked from 0ad/0ad

Fixes shore waves rendering after 29368cf776.

Tested By: phosit
Differential Revision: https://code.wildfiregames.com/D4865
This was SVN commit r27375.
This commit is contained in:
Vladislav Belov 2023-01-06 19:11:47 +00:00
parent 1e2f23750b
commit 38a6726a07
4 changed files with 41 additions and 12 deletions

View File

@ -190,7 +190,7 @@ Renderer::Backend::IVertexInputLayout* CPatchRData::GetWaterSurfaceVertexInputLa
Renderer::Backend::IVertexInputLayout* CPatchRData::GetWaterShoreVertexInputLayout()
{
const uint32_t stride = sizeof(SWaterVertex);
const std::array<Renderer::Backend::SVertexAttributeFormat, 2> attributes{ {
const std::array<Renderer::Backend::SVertexAttributeFormat, 2> attributes{{
{Renderer::Backend::VertexAttributeStream::POSITION,
Renderer::Backend::Format::R32G32B32_SFLOAT,
offsetof(SWaterVertex, m_Position), stride,

View File

@ -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(

View File

@ -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(

View File

@ -112,6 +112,7 @@ public:
std::unique_ptr<Renderer::Backend::IFramebuffer> m_RefractionFramebuffer;
std::unique_ptr<Renderer::Backend::IFramebuffer> m_ReflectionFramebuffer;
std::unique_ptr<Renderer::Backend::IFramebuffer> m_FancyEffectsFramebuffer;
std::unique_ptr<Renderer::Backend::IFramebuffer> m_FancyEffectsOccludersFramebuffer;
// Model-view-projection matrices for reflected & refracted cameras
// (used to let the vertex shader do projective texturing)