Skip to content

Commit bb1a613

Browse files
authored
Various fixes and cleanup for post-process pass (#551)
1 parent c5e2362 commit bb1a613

File tree

10 files changed

+42
-45
lines changed

10 files changed

+42
-45
lines changed

Resources/Engine/Shaders/PostProcess/Bloom.ovfx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void main()
1616
#version 450 core
1717

1818
in vec2 TexCoords;
19-
out vec3 FRAGMENT_COLOR;
19+
out vec4 FRAGMENT_COLOR;
2020

2121
uniform sampler2D _InputTexture;
2222
uniform sampler2D _BloomTexture;
@@ -26,5 +26,5 @@ void main()
2626
{
2727
const vec3 hdrColor = texture(_InputTexture, TexCoords).rgb;
2828
const vec3 bloomColor = texture(_BloomTexture, TexCoords).rgb;
29-
FRAGMENT_COLOR = mix(hdrColor, bloomColor, _BloomStrength);
29+
FRAGMENT_COLOR = vec4(mix(hdrColor, bloomColor, _BloomStrength), 1.0);
3030
}

Resources/Engine/Shaders/PostProcess/BloomDownsampling.ovfx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void main()
1818
#version 450 core
1919

2020
in vec2 TexCoords;
21-
out vec3 downsample;
21+
out vec4 FRAGMENT_COLOR;
2222

2323
uniform sampler2D _InputTexture;
2424
uniform vec2 _InputResolution;
@@ -88,6 +88,8 @@ void main()
8888
// to effectively yield this sum. We get:
8989
// 0.125*5 + 0.03125*4 + 0.0625*4 = 1
9090

91+
vec3 downsample = vec3(0.0);
92+
9193
// Check if we need to perform Karis average on each block of 4 samples
9294
#if defined(KARIS_AVERAGE)
9395
vec3 groups[5];
@@ -112,4 +114,6 @@ void main()
112114
downsample += (b+d+f+h)*0.0625; // ok
113115
downsample += (j+k+l+m)*0.125; // ok
114116
#endif
117+
118+
FRAGMENT_COLOR = vec4(downsample, 1.0);
115119
}

Resources/Engine/Shaders/PostProcess/BloomUpsampling.ovfx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ void main()
1616
#version 450 core
1717

1818
in vec2 TexCoords;
19-
out vec3 upsample;
19+
out vec4 FRAGMENT_COLOR;
2020

2121
uniform sampler2D _InputTexture;
2222
uniform float _FilterRadius;
@@ -47,8 +47,10 @@ void main()
4747
// 1 | 1 2 1 |
4848
// -- * | 2 4 2 |
4949
// 16 | 1 2 1 |
50-
upsample = e*4.0;
50+
vec3 upsample = e*4.0;
5151
upsample += (b+d+f+h)*2.0;
5252
upsample += (a+c+g+i);
5353
upsample *= 1.0 / 16.0;
54+
55+
FRAGMENT_COLOR = vec4(upsample, 1.0);
5456
}

Sources/Overload/OvCore/include/OvCore/Rendering/PostProcess/AutoExposureEffect.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <chrono>
1010

11+
#include <OvCore/Rendering/PingPongFramebuffer.h>
1112
#include <OvCore/Rendering/PostProcess/AEffect.h>
1213
#include <OvRendering/Data/Material.h>
1314

@@ -57,8 +58,7 @@ namespace OvCore::Rendering::PostProcess
5758
private:
5859
std::optional<std::chrono::high_resolution_clock::time_point> m_previousTime;
5960
OvRendering::HAL::Framebuffer m_luminanceBuffer;
60-
std::array<OvRendering::HAL::Framebuffer, 2> m_exposurePingPongBuffer;
61-
uint8_t m_exposurePingPongIndex = 0;
61+
PingPongFramebuffer m_exposurePingPongBuffer;
6262
OvRendering::Data::Material m_luminanceMaterial;
6363
OvRendering::Data::Material m_exposureMaterial;
6464
OvRendering::Data::Material m_compensationMaterial;

Sources/Overload/OvCore/include/OvCore/Rendering/PostProcess/BloomEffect.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
#pragma once
88

9-
#include <OvCore/Rendering/PingPongFramebuffer.h>
109
#include <OvCore/Rendering/PostProcess/AEffect.h>
1110
#include <OvRendering/Data/Material.h>
1211
#include <OvRendering/HAL/Framebuffer.h>

Sources/Overload/OvCore/include/OvCore/Rendering/PostProcessRenderPass.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <OvRendering/Core/ARenderPass.h>
1010
#include <OvRendering/HAL/Framebuffer.h>
11+
#include <OvCore/Rendering/PingPongFramebuffer.h>
1112
#include <OvCore/Rendering/PostProcess/AEffect.h>
1213

1314
namespace OvCore::Rendering
@@ -30,6 +31,6 @@ namespace OvCore::Rendering
3031
private:
3132
OvRendering::Data::Material m_blitMaterial;
3233
std::vector<std::unique_ptr<PostProcess::AEffect>> m_effects;
33-
std::array<OvRendering::HAL::Framebuffer, 2> m_pingPongBuffers;
34+
PingPongFramebuffer m_pingPongBuffers;
3435
};
35-
}
36+
}

Sources/Overload/OvCore/src/OvCore/ECS/Components/CPostProcessStack.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,25 +81,25 @@ void OvCore::ECS::Components::CPostProcessStack::OnInspector(OvUI::Internal::Wid
8181
auto& fxaaSettings = m_settings.Get<Rendering::PostProcess::FXAAEffect, Rendering::PostProcess::FXAASettings>();
8282
auto& tonemappingSettings = m_settings.Get<Rendering::PostProcess::TonemappingEffect, Rendering::PostProcess::TonemappingSettings>();
8383

84-
OvCore::Helpers::GUIDrawer::DrawBoolean(p_root, "Bloom Enabled", bloomSettings.enabled);
85-
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Bloom Intensity", bloomSettings.intensity, 0.1f, 0.0f, Rendering::PostProcess::BloomConstants::kMaxBloomIntensity);
86-
OvCore::Helpers::GUIDrawer::DrawScalar<int>(p_root, "Bloom Passes", bloomSettings.passes, 1, Rendering::PostProcess::BloomConstants::kMinPassCount, Rendering::PostProcess::BloomConstants::kMaxPassCount);
87-
88-
p_root.CreateWidget<OvUI::Widgets::Visual::Separator>();
89-
p_root.CreateWidget<OvUI::Widgets::Layout::Spacing>();
90-
9184
OvCore::Helpers::GUIDrawer::DrawBoolean(p_root, "Auto Exposure Enabled", autoExposureSettings.enabled);
9285
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Center Weight Bias", autoExposureSettings.centerWeightBias, 0.1f, 0.0f, 1.0f);
93-
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Min Luminance (EV)", autoExposureSettings.minLuminanceEV, 1.0f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
94-
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Max Luminance (EV)", autoExposureSettings.maxLuminanceEV, 1.0f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
95-
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Exposure Compensation (EV)", autoExposureSettings.exposureCompensationEV, 1.0f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
86+
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Min Luminance (EV)", autoExposureSettings.minLuminanceEV, 0.1f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
87+
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Max Luminance (EV)", autoExposureSettings.maxLuminanceEV, 0.1f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
88+
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Exposure Compensation (EV)", autoExposureSettings.exposureCompensationEV, 0.1f, OvCore::Helpers::GUIDrawer::_MIN_FLOAT, OvCore::Helpers::GUIDrawer::_MAX_FLOAT);
9689
OvCore::Helpers::GUIDrawer::DrawBoolean(p_root, "Auto Exposure Progressive", autoExposureSettings.progressive);
9790
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Speed Up", autoExposureSettings.speedUp);
9891
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Auto Exposure Speed Down", autoExposureSettings.speedDown);
9992

10093
p_root.CreateWidget<OvUI::Widgets::Visual::Separator>();
10194
p_root.CreateWidget<OvUI::Widgets::Layout::Spacing>();
10295

96+
OvCore::Helpers::GUIDrawer::DrawBoolean(p_root, "Bloom Enabled", bloomSettings.enabled);
97+
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Bloom Intensity", bloomSettings.intensity, 0.1f, 0.0f, Rendering::PostProcess::BloomConstants::kMaxBloomIntensity);
98+
OvCore::Helpers::GUIDrawer::DrawScalar<int>(p_root, "Bloom Passes", bloomSettings.passes, 1, Rendering::PostProcess::BloomConstants::kMinPassCount, Rendering::PostProcess::BloomConstants::kMaxPassCount);
99+
100+
p_root.CreateWidget<OvUI::Widgets::Visual::Separator>();
101+
p_root.CreateWidget<OvUI::Widgets::Layout::Spacing>();
102+
103103
OvCore::Helpers::GUIDrawer::DrawBoolean(p_root, "Tonemapping Enabled", tonemappingSettings.enabled);
104104
OvCore::Helpers::GUIDrawer::DrawScalar<float>(p_root, "Tonemapping Exposure", tonemappingSettings.exposure, 0.05f, 0.0f);
105105
Helpers::GUIDrawer::CreateTitle(p_root, "Tonemapping Mode");
@@ -112,8 +112,7 @@ void OvCore::ECS::Components::CPostProcessStack::OnInspector(OvUI::Internal::Wid
112112
{ 4, "Uncharted 2 (Filmic)" },
113113
{ 5, "ACES" }
114114
};
115-
tonemappingMode.ValueChangedEvent += [this](int p_choice)
116-
{
115+
tonemappingMode.ValueChangedEvent += [this](int p_choice) {
117116
auto& tonemappingSettings = m_settings.Get<Rendering::PostProcess::TonemappingEffect, Rendering::PostProcess::TonemappingSettings>();
118117
tonemappingSettings.mode = static_cast<OvCore::Rendering::PostProcess::ETonemappingMode>(p_choice);
119118
};

Sources/Overload/OvCore/src/OvCore/Rendering/PostProcess/AutoExposureEffect.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,9 @@ OvCore::Rendering::PostProcess::AutoExposureEffect::AutoExposureEffect(
1818
OvRendering::Core::CompositeRenderer& p_renderer
1919
) : AEffect(p_renderer),
2020
m_luminanceBuffer{ "Luminance" },
21-
m_exposurePingPongBuffer{
22-
OvRendering::HAL::Framebuffer{"ExposurePingPong0"},
23-
OvRendering::HAL::Framebuffer{"ExposurePingPong1"}
24-
}
21+
m_exposurePingPongBuffer{ "Exposure" }
2522
{
26-
for (auto& buffer : m_exposurePingPongBuffer)
23+
for (auto& buffer : m_exposurePingPongBuffer.GetFramebuffers())
2724
{
2825
FramebufferUtil::SetupFramebuffer(
2926
buffer,
@@ -76,9 +73,9 @@ void OvCore::Rendering::PostProcess::AutoExposureEffect::Draw(
7673
}
7774
m_previousTime = currentTime;
7875

79-
auto& previousExposure = m_exposurePingPongBuffer[(m_exposurePingPongIndex + 1) % 2];
80-
auto& currentExposure = m_exposurePingPongBuffer[m_exposurePingPongIndex];
81-
m_exposurePingPongIndex = (m_exposurePingPongIndex + 1) % 2;
76+
auto& previousExposure = m_exposurePingPongBuffer[0];
77+
auto& currentExposure = m_exposurePingPongBuffer[1];
78+
++m_exposurePingPongBuffer;
8279

8380
// Exposure adaptation
8481
m_exposureMaterial.SetProperty("_LuminanceTexture", &luminanceTex.value(), true);

Sources/Overload/OvCore/src/OvCore/Rendering/PostProcessRenderPass.cpp

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,9 @@
1818

1919
OvCore::Rendering::PostProcessRenderPass::PostProcessRenderPass(OvRendering::Core::CompositeRenderer& p_renderer) :
2020
OvRendering::Core::ARenderPass(p_renderer),
21-
m_pingPongBuffers{
22-
OvRendering::HAL::Framebuffer{"PostProcessBlitPingPong0"},
23-
OvRendering::HAL::Framebuffer{"PostProcessBlitPingPong1"}
24-
}
21+
m_pingPongBuffers{ "PostProcessBlit" }
2522
{
26-
for (auto& buffer : m_pingPongBuffers)
23+
for (auto& buffer : m_pingPongBuffers.GetFramebuffers())
2724
{
2825
OvCore::Rendering::FramebufferUtil::SetupFramebuffer(
2926
buffer, 1, 1, false, false, false
@@ -65,12 +62,8 @@ void OvCore::Rendering::PostProcessRenderPass::Draw(OvRendering::Data::PipelineS
6562

6663
if (auto stack = FindPostProcessStack(scene))
6764
{
68-
uint32_t passIndex = 0;
69-
7065
auto& framebuffer = m_renderer.GetFrameDescriptor().outputBuffer.value();
7166

72-
const uint64_t kPingPongBufferSize = m_pingPongBuffers.size();
73-
7467
m_renderer.Blit(p_pso, framebuffer, m_pingPongBuffers[0], m_blitMaterial);
7568

7669
for (auto& effect : m_effects)
@@ -81,17 +74,15 @@ void OvCore::Rendering::PostProcessRenderPass::Draw(OvRendering::Data::PipelineS
8174
{
8275
effect->Draw(
8376
p_pso,
84-
m_pingPongBuffers[passIndex % kPingPongBufferSize],
85-
m_pingPongBuffers[(passIndex + 1) % kPingPongBufferSize],
77+
m_pingPongBuffers[0],
78+
m_pingPongBuffers[1],
8679
settings
8780
);
8881

89-
++passIndex;
82+
++m_pingPongBuffers;
9083
}
9184
}
9285

93-
const uint64_t lastIndex = passIndex % kPingPongBufferSize;
94-
95-
m_renderer.Blit(p_pso, m_pingPongBuffers[lastIndex], framebuffer, m_blitMaterial);
86+
m_renderer.Blit(p_pso, m_pingPongBuffers[0], framebuffer, m_blitMaterial);
9687
}
9788
}

Sources/Overload/OvRendering/src/OvRendering/Context/Driver.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ OvRendering::Context::Driver::~Driver()
5151
void OvRendering::Context::Driver::OnFrameCompleted()
5252
{
5353
m_gfxBackend->OnFrameCompleted();
54+
55+
// Prevents state leak between frames, and especially useful when external code (like ImGui)
56+
// requires a "neutral" pipeline state.
57+
ResetPipelineState();
5458
}
5559

5660
void OvRendering::Context::Driver::SetViewport(uint32_t p_x, uint32_t p_y, uint32_t p_width, uint32_t p_height)

0 commit comments

Comments
 (0)