diff --git a/include/Nazara/Graphics/Graphics.hpp b/include/Nazara/Graphics/Graphics.hpp index 93a3f926d..b9b9ad82f 100644 --- a/include/Nazara/Graphics/Graphics.hpp +++ b/include/Nazara/Graphics/Graphics.hpp @@ -34,7 +34,7 @@ namespace Nz Graphics(Config config); ~Graphics(); - inline const std::shared_ptr& GetBlitPipeline() const; + inline const std::shared_ptr& GetBlitPipeline(bool transparent) const; inline const std::shared_ptr& GetBlitPipelineLayout() const; inline const DefaultTextures& GetDefaultTextures() const; inline const std::shared_ptr& GetFullscreenVertexBuffer() const; @@ -73,6 +73,7 @@ namespace Nz std::shared_ptr m_fullscreenVertexBuffer; std::shared_ptr m_renderDevice; std::shared_ptr m_blitPipeline; + std::shared_ptr m_blitPipelineTransparent; std::shared_ptr m_blitPipelineLayout; std::shared_ptr m_fullscreenVertexDeclaration; DefaultTextures m_defaultTextures; diff --git a/include/Nazara/Graphics/Graphics.inl b/include/Nazara/Graphics/Graphics.inl index 1f0fa8675..f2c42df09 100644 --- a/include/Nazara/Graphics/Graphics.inl +++ b/include/Nazara/Graphics/Graphics.inl @@ -7,9 +7,9 @@ namespace Nz { - inline const std::shared_ptr& Graphics::GetBlitPipeline() const + inline const std::shared_ptr& Graphics::GetBlitPipeline(bool transparent) const { - return m_blitPipeline; + return (transparent) ? m_blitPipelineTransparent : m_blitPipeline; } inline const std::shared_ptr& Graphics::GetBlitPipelineLayout() const diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 7f8fc5ddc..c00c21745 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -386,15 +386,23 @@ namespace Nz { builder.SetScissor(renderRegion); builder.SetViewport(renderRegion); - builder.BindPipeline(*graphics->GetBlitPipeline()); + builder.BindPipeline(*graphics->GetBlitPipeline(false)); builder.BindVertexBuffer(0, *graphics->GetFullscreenVertexBuffer()); + bool first = true; + for (const ViewerData* viewerData : viewers) { const ShaderBindingPtr& blitShaderBinding = viewerData->blitShaderBinding; builder.BindShaderBinding(0, *blitShaderBinding); builder.Draw(3); + + if (first) + { + builder.BindPipeline(*graphics->GetBlitPipeline(true)); + first = false; + } } } builder.EndDebugRegion(); diff --git a/src/Nazara/Graphics/Graphics.cpp b/src/Nazara/Graphics/Graphics.cpp index 9d301af60..cebfd7b99 100644 --- a/src/Nazara/Graphics/Graphics.cpp +++ b/src/Nazara/Graphics/Graphics.cpp @@ -164,15 +164,6 @@ namespace Nz RenderPipelineInfo pipelineInfo; - // Alpha blending - pipelineInfo.blending = true; - pipelineInfo.blend.modeColor = BlendEquation::Add; - pipelineInfo.blend.modeAlpha = BlendEquation::Add; - pipelineInfo.blend.srcColor = BlendFunc::One; - pipelineInfo.blend.dstColor = BlendFunc::One; - pipelineInfo.blend.srcAlpha = BlendFunc::One; - pipelineInfo.blend.dstAlpha = BlendFunc::One; - pipelineInfo.pipelineLayout = m_blitPipelineLayout; pipelineInfo.shaderModules.push_back(std::move(blitShader)); pipelineInfo.vertexBuffers.assign({ @@ -182,7 +173,18 @@ namespace Nz } }); - m_blitPipeline = m_renderDevice->InstantiateRenderPipeline(std::move(pipelineInfo)); + m_blitPipeline = m_renderDevice->InstantiateRenderPipeline(pipelineInfo); + + // Blending + pipelineInfo.blending = true; + pipelineInfo.blend.modeColor = BlendEquation::Add; + pipelineInfo.blend.modeAlpha = BlendEquation::Add; + pipelineInfo.blend.srcColor = BlendFunc::SrcAlpha; + pipelineInfo.blend.dstColor = BlendFunc::InvSrcAlpha; + pipelineInfo.blend.srcAlpha = BlendFunc::SrcAlpha; + pipelineInfo.blend.dstAlpha = BlendFunc::InvSrcAlpha; + + m_blitPipelineTransparent = m_renderDevice->InstantiateRenderPipeline(std::move(pipelineInfo)); } void Graphics::BuildDefaultTextures()