From fd40ea471351fff31887be0bc065bb3b442027bd Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Tue, 7 Jan 2020 20:48:09 +0000 Subject: [PATCH] added ssao power control --- Editor/PostprocessWindow.cpp | 12 +++++++++++- Editor/PostprocessWindow.h | 1 + WickedEngine/RenderPath3D.cpp | 3 ++- WickedEngine/RenderPath3D.h | 3 +++ WickedEngine/ShaderInterop_Postprocess.h | 4 ++++ WickedEngine/ssaoCS.hlsl | 12 +++++------- WickedEngine/wiRenderer.cpp | 8 +++++--- WickedEngine/wiRenderer.h | 3 ++- WickedEngine/wiVersion.cpp | 2 +- 9 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index 7bcf9dd6f..75ce3c917 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -16,7 +16,7 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, RenderPath3D* comp) : GUI(gui), float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); ppWindow = new wiWindow(GUI, "PostProcess Window"); - ppWindow->SetSize(XMFLOAT2(400, 720)); + ppWindow->SetSize(XMFLOAT2(400, 740)); GUI->AddWidget(ppWindow); float x = 150; @@ -83,6 +83,16 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, RenderPath3D* comp) : GUI(gui), }); ppWindow->AddWidget(ssaoSampleCountSlider); + ssaoPowerSlider = new wiSlider(0.25f, 8.0f, 2, 1000, "Power: "); + ssaoPowerSlider->SetTooltip("Set SSAO Power. Higher values produce darker, more pronounced effect"); + ssaoPowerSlider->SetSize(XMFLOAT2(100, 20)); + ssaoPowerSlider->SetPos(XMFLOAT2(x + 100, y += 35)); + ssaoPowerSlider->SetValue((float)component->getSSAOPower()); + ssaoPowerSlider->OnSlide([&](wiEventArgs args) { + component->setSSAOPower(args.fValue); + }); + ppWindow->AddWidget(ssaoPowerSlider); + ssrCheckBox = new wiCheckBox("SSR: "); ssrCheckBox->SetTooltip("Enable Screen Space Reflections."); ssrCheckBox->SetScriptTip("RenderPath3D::SetSSREnabled(bool value)"); diff --git a/Editor/PostprocessWindow.h b/Editor/PostprocessWindow.h index 982181255..6df3efa17 100644 --- a/Editor/PostprocessWindow.h +++ b/Editor/PostprocessWindow.h @@ -25,6 +25,7 @@ public: wiCheckBox* ssaoCheckBox; wiSlider* ssaoRangeSlider; wiSlider* ssaoSampleCountSlider; + wiSlider* ssaoPowerSlider; wiCheckBox* ssrCheckBox; wiCheckBox* sssCheckBox; wiCheckBox* eyeAdaptionCheckBox; diff --git a/WickedEngine/RenderPath3D.cpp b/WickedEngine/RenderPath3D.cpp index 63425747f..d17911d28 100644 --- a/WickedEngine/RenderPath3D.cpp +++ b/WickedEngine/RenderPath3D.cpp @@ -412,7 +412,8 @@ void RenderPath3D::RenderSSAO(CommandList cmd) const cmd, getSSAORange(), getSSAOSampleCount(), - getSSAOBlur() + getSSAOBlur(), + getSSAOPower() ); } } diff --git a/WickedEngine/RenderPath3D.h b/WickedEngine/RenderPath3D.h index c61fbb48c..4fc6dc636 100644 --- a/WickedEngine/RenderPath3D.h +++ b/WickedEngine/RenderPath3D.h @@ -23,6 +23,7 @@ private: XMFLOAT4 outlineColor = XMFLOAT4(0, 0, 0, 1); float ssaoRange = 1.0f; uint32_t ssaoSampleCount = 16; + float ssaoPower = 2.0f; float chromaticAberrationAmount = 2.0f; bool fxaaEnabled = false; @@ -124,6 +125,7 @@ public: constexpr XMFLOAT4 getOutlineColor() const { return outlineColor; } constexpr float getSSAORange() const { return ssaoRange; } constexpr uint32_t getSSAOSampleCount() const { return ssaoSampleCount; } + constexpr float getSSAOPower() const { return ssaoPower; } constexpr float getChromaticAberrationAmount() const { return chromaticAberrationAmount; } constexpr bool getSSAOEnabled() const { return ssaoEnabled; } @@ -162,6 +164,7 @@ public: constexpr void setOutlineColor(const XMFLOAT4& value) { outlineColor = value; } constexpr void setSSAORange(float value) { ssaoRange = value; } constexpr void setSSAOSampleCount(uint32_t value) { ssaoSampleCount = value; } + constexpr void setSSAOPower(float value) { ssaoPower = value; } constexpr void setChromaticAberrationAmount(float value) { chromaticAberrationAmount = value; } constexpr void setSSAOEnabled(bool value){ ssaoEnabled = value; } diff --git a/WickedEngine/ShaderInterop_Postprocess.h b/WickedEngine/ShaderInterop_Postprocess.h index 8e6e9c8e2..8c2321c12 100644 --- a/WickedEngine/ShaderInterop_Postprocess.h +++ b/WickedEngine/ShaderInterop_Postprocess.h @@ -12,6 +12,10 @@ CBUFFER(PostProcessCB, CBSLOT_RENDERER_POSTPROCESS) float4 xPPParams1; }; +#define ssao_range xPPParams0.x +#define ssao_samplecount xPPParams0.y +#define ssao_power xPPParams0.z + static const uint MOTIONBLUR_TILESIZE = 32; #define motionblur_strength xPPParams0.x diff --git a/WickedEngine/ssaoCS.hlsl b/WickedEngine/ssaoCS.hlsl index 649e16d59..ae637fa6f 100644 --- a/WickedEngine/ssaoCS.hlsl +++ b/WickedEngine/ssaoCS.hlsl @@ -74,8 +74,6 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint3 GTid : const float3 normal = normalize(cross(p2 - P, p1 - P)); const float2 uv = (DTid.xy + 0.5f) * xPPResolution_rcp; - const float range = xPPParams0.x; - const uint sampleCount = xPPParams0.y; float seed = 1; const float3 noise = float3(rand(seed, uv), rand(seed, uv), rand(seed, uv)) * 2 - 1; @@ -85,12 +83,12 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint3 GTid : const float3x3 tangentSpace = float3x3(tangent, bitangent, normal); float ao = 0; - for (uint i = 0; i < sampleCount; ++i) + for (uint i = 0; i < (uint)ssao_samplecount; ++i) { - const float2 hamm = hammersley2d(i, sampleCount); + const float2 hamm = hammersley2d(i, ssao_samplecount); const float3 hemisphere = hemispherepoint_uniform(hamm.x, hamm.y); const float3 cone = mul(hemisphere, tangentSpace); - const float ray_range = range * lerp(0.2f, 1.0f, rand(seed, uv)); // modulate ray-length a bit to avoid uniform look + const float ray_range = ssao_range * lerp(0.2f, 1.0f, rand(seed, uv)); // modulate ray-length a bit to avoid uniform look const float3 sam = P + cone * ray_range; float4 vProjectedCoord = mul(g_xCamera_Proj, float4(sam, 1.0f)); @@ -112,7 +110,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint3 GTid : #endif // USE_LINEARDEPTH } } - ao /= (float)sampleCount; + ao /= ssao_samplecount; - output[DTid.xy] = saturate(1 - ao); + output[DTid.xy] = pow(saturate(1 - ao), ssao_power); } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index ede4d1c22..bcb96f3f5 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -8589,7 +8589,8 @@ void Postprocess_SSAO( CommandList cmd, float range, uint32_t samplecount, - float blur + float blur, + float power ) { GraphicsDevice* device = GetDevice(); @@ -8611,8 +8612,9 @@ void Postprocess_SSAO( cb.xPPResolution.y = desc.Height; cb.xPPResolution_rcp.x = 1.0f / cb.xPPResolution.x; cb.xPPResolution_rcp.y = 1.0f / cb.xPPResolution.y; - cb.xPPParams0.x = range; - cb.xPPParams0.y = (float)samplecount; + cb.ssao_range = range; + cb.ssao_samplecount = (float)samplecount; + cb.ssao_power = power; device->UpdateBuffer(&constantBuffers[CBTYPE_POSTPROCESS], &cb, cmd); device->BindConstantBuffer(CS, &constantBuffers[CBTYPE_POSTPROCESS], CB_GETBINDSLOT(PostProcessCB), cmd); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 329f2a352..37faf538d 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -201,7 +201,8 @@ namespace wiRenderer wiGraphics::CommandList cmd, float range = 1.0f, uint32_t samplecount = 16, - float blur = 2.3f + float blur = 2.3f, + float power = 2.0f ); void Postprocess_SSR( const wiGraphics::Texture& input, diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 425d4c027..bb817f2bd 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 36; // minor bug fixes, alterations, refactors, updates - const int revision = 38; + const int revision = 39; long GetVersion()