diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index bb032bc9e..e7daa91fb 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -18,7 +18,7 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, RenderPath3D* comp) : GUI(gui), float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); ppWindow = new wiWindow(GUI, "PostProcess Window"); - ppWindow->SetSize(XMFLOAT2(360, 640)); + ppWindow->SetSize(XMFLOAT2(360, 660)); GUI->AddWidget(ppWindow); float x = 110; @@ -65,6 +65,26 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, RenderPath3D* comp) : GUI(gui), }); ppWindow->AddWidget(ssaoCheckBox); + ssaoRangeSlider = new wiSlider(0, 2, 1, 1000, "Range: "); + ssaoRangeSlider->SetTooltip("Set SSAO Detection range."); + ssaoRangeSlider->SetSize(XMFLOAT2(100, 20)); + ssaoRangeSlider->SetPos(XMFLOAT2(x + 100, y)); + ssaoRangeSlider->SetValue(component->getSSAORange()); + ssaoRangeSlider->OnSlide([&](wiEventArgs args) { + component->setSSAORange(args.fValue); + }); + ppWindow->AddWidget(ssaoRangeSlider); + + ssaoSampleCountSlider = new wiSlider(9, 64, 16, 64-9, "SampleCount: "); + ssaoSampleCountSlider->SetTooltip("Set SSAO Sample Count. Higher values produce better quality, but slower to compute"); + ssaoSampleCountSlider->SetSize(XMFLOAT2(100, 20)); + ssaoSampleCountSlider->SetPos(XMFLOAT2(x + 100, y += 35)); + ssaoSampleCountSlider->SetValue((float)component->getSSAOSampleCount()); + ssaoSampleCountSlider->OnSlide([&](wiEventArgs args) { + component->setSSAOSampleCount((UINT)args.iValue); + }); + ppWindow->AddWidget(ssaoSampleCountSlider); + 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 759f87bc2..80ac88b44 100644 --- a/Editor/PostprocessWindow.h +++ b/Editor/PostprocessWindow.h @@ -23,6 +23,8 @@ public: wiCheckBox* lensFlareCheckBox; wiCheckBox* lightShaftsCheckBox; wiCheckBox* ssaoCheckBox; + wiSlider* ssaoRangeSlider; + wiSlider* ssaoSampleCountSlider; wiCheckBox* ssrCheckBox; wiCheckBox* sssCheckBox; wiCheckBox* eyeAdaptionCheckBox; diff --git a/Editor/xatlas.cpp b/Editor/xatlas.cpp index bdb0b7873..f8f3d6114 100644 --- a/Editor/xatlas.cpp +++ b/Editor/xatlas.cpp @@ -2324,14 +2324,14 @@ public: void clear() { for (size_t i = 0; i < m_vertexArray.size(); i++) - delete m_vertexArray[i]; + delete m_vertexArray[(uint32_t)i]; m_vertexArray.clear(); for (EdgeMap::PseudoIndex it = m_edgeMap.start(); !m_edgeMap.isDone(it); m_edgeMap.advance(it)) delete m_edgeMap[it].value; m_edgeArray.clear(); m_edgeMap.clear(); for (size_t i = 0; i < m_faceArray.size(); i++) - delete m_faceArray[i]; + delete m_faceArray[(uint32_t)i]; m_faceArray.clear(); } @@ -2610,9 +2610,9 @@ public: XA_DEBUG_ASSERT(m_faceArray.size() > faceCount); // triangle count > face count linkBoundary(); for (size_t i = 0; i < edgeArray.size(); i++) - delete edgeArray[i]; + delete edgeArray[(uint32_t)i]; for (size_t i = 0; i < faceArray.size(); i++) - delete faceArray[i]; + delete faceArray[(uint32_t)i]; } /// Link boundary edges once the mesh has been created. @@ -5431,7 +5431,7 @@ struct AtlasBuilder } XA_DEBUG_ASSERT(maxDistance >= 0); // In order to prevent k-means cyles we record all the previously chosen seeds. - uint32_t index = std::find(chart->seeds.begin(), chart->seeds.end(), mostCentral) - chart->seeds.begin(); + uint32_t index = (uint32_t)(std::find(chart->seeds.begin(), chart->seeds.end(), mostCentral) - chart->seeds.begin()); if (index < chart->seeds.size()) { // Move new seed to the end of the seed array. uint32_t last = chart->seeds.size() - 1; @@ -6470,7 +6470,7 @@ public: ~MeshCharts() { for (size_t i = 0; i < m_chartArray.size(); i++) - delete m_chartArray[i]; + delete m_chartArray[(uint32_t)i]; } uint32_t chartCount() const @@ -6779,7 +6779,7 @@ public: ~Atlas() { for (size_t i = 0; i < m_meshChartsArray.size(); i++) - delete m_meshChartsArray[i]; + delete m_meshChartsArray[(uint32_t)i]; } uint32_t meshCount() const diff --git a/Tests/Tests.cpp b/Tests/Tests.cpp index b4c53829b..06182cbc0 100644 --- a/Tests/Tests.cpp +++ b/Tests/Tests.cpp @@ -408,7 +408,7 @@ void TestsRenderer::RunSpriteTest() static wiSprite sprite("../logo/logo_small.png"); sprite.params = params; sprite.anim = wiSprite::Anim(); - sprite.anim.wobbleAnim.amount = XMFLOAT2(1.2, 0.8); + sprite.anim.wobbleAnim.amount = XMFLOAT2(1.2f, 0.8f); addSprite(&sprite); static wiFont font("Wobble animation: "); diff --git a/WickedEngine/RenderPath3D.cpp b/WickedEngine/RenderPath3D.cpp index de2e39ad1..0472e421d 100644 --- a/WickedEngine/RenderPath3D.cpp +++ b/WickedEngine/RenderPath3D.cpp @@ -163,6 +163,8 @@ void RenderPath3D::setProperties() setOutlineThreshold(0.2f); setOutlineThickness(1.0f); setOutlineColor(XMFLOAT3(0, 0, 0)); + setSSAORange(1.0f); + setSSAOSampleCount(16); setSSAOEnabled(true); setSSREnabled(true); diff --git a/WickedEngine/RenderPath3D.h b/WickedEngine/RenderPath3D.h index 8e6bce3f5..6f0184686 100644 --- a/WickedEngine/RenderPath3D.h +++ b/WickedEngine/RenderPath3D.h @@ -20,6 +20,8 @@ private: float outlineThreshold; float outlineThickness; XMFLOAT3 outlineColor; + float ssaoRange; + UINT ssaoSampleCount; bool fxaaEnabled; bool ssaoEnabled; @@ -93,6 +95,8 @@ public: inline float getOutlineThreshold() { return outlineThreshold; } inline float getOutlineThickness() { return outlineThickness; } inline XMFLOAT3 getOutlineColor() { return outlineColor; } + inline float getSSAORange() { return ssaoRange; } + inline UINT getSSAOSampleCount() { return ssaoSampleCount; } inline bool getSSAOEnabled(){ return ssaoEnabled; } inline bool getSSREnabled(){ return ssrEnabled; } @@ -133,6 +137,8 @@ public: inline void setOutlineThreshold(float value) { outlineThreshold = value; } inline void setOutlineThickness(float value) { outlineThickness = value; } inline void setOutlineColor(const XMFLOAT3& value) { outlineColor = value; } + inline void setSSAORange(float value) { ssaoRange = value; } + inline void setSSAOSampleCount(UINT value) { ssaoSampleCount = value; } inline void setSSAOEnabled(bool value){ ssaoEnabled = value; } inline void setSSREnabled(bool value){ ssrEnabled = value; } diff --git a/WickedEngine/RenderPath3D_Deferred.cpp b/WickedEngine/RenderPath3D_Deferred.cpp index 8fdaf5a10..17691926c 100644 --- a/WickedEngine/RenderPath3D_Deferred.cpp +++ b/WickedEngine/RenderPath3D_Deferred.cpp @@ -199,7 +199,7 @@ void RenderPath3D_Deferred::RenderScene(GRAPHICSTHREAD threadID) fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; rtSSAO[0].Activate(threadID); { - fx.process.setSSAO(); + fx.process.setSSAO(getSSAORange(), getSSAOSampleCount()); fx.setMaskMap(wiTextureHelper::getRandom64x64()); fx.quality = QUALITY_LINEAR; fx.sampleFlag = SAMPLEMODE_MIRROR; diff --git a/WickedEngine/RenderPath3D_Forward.cpp b/WickedEngine/RenderPath3D_Forward.cpp index 3d66b44dc..13865b293 100644 --- a/WickedEngine/RenderPath3D_Forward.cpp +++ b/WickedEngine/RenderPath3D_Forward.cpp @@ -123,7 +123,7 @@ void RenderPath3D_Forward::RenderScene(GRAPHICSTHREAD threadID) fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; rtSSAO[0].Activate(threadID); { - fx.process.setSSAO(); + fx.process.setSSAO(getSSAORange(), getSSAOSampleCount()); fx.setMaskMap(wiTextureHelper::getRandom64x64()); fx.quality = QUALITY_LINEAR; fx.sampleFlag = SAMPLEMODE_MIRROR; diff --git a/WickedEngine/RenderPath3D_TiledDeferred.cpp b/WickedEngine/RenderPath3D_TiledDeferred.cpp index c9dfb2662..4579e8a9b 100644 --- a/WickedEngine/RenderPath3D_TiledDeferred.cpp +++ b/WickedEngine/RenderPath3D_TiledDeferred.cpp @@ -110,7 +110,7 @@ void RenderPath3D_TiledDeferred::RenderScene(GRAPHICSTHREAD threadID) fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; rtSSAO[0].Activate(threadID); { - fx.process.setSSAO(); + fx.process.setSSAO(getSSAORange(), getSSAOSampleCount()); fx.setMaskMap(wiTextureHelper::getRandom64x64()); fx.quality = QUALITY_LINEAR; fx.sampleFlag = SAMPLEMODE_MIRROR; diff --git a/WickedEngine/RenderPath3D_TiledForward.cpp b/WickedEngine/RenderPath3D_TiledForward.cpp index a39fcd37f..20989ade0 100644 --- a/WickedEngine/RenderPath3D_TiledForward.cpp +++ b/WickedEngine/RenderPath3D_TiledForward.cpp @@ -73,7 +73,7 @@ void RenderPath3D_TiledForward::RenderScene(GRAPHICSTHREAD threadID) fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; rtSSAO[0].Activate(threadID); { - fx.process.setSSAO(); + fx.process.setSSAO(getSSAORange(), getSSAOSampleCount()); fx.setMaskMap(wiTextureHelper::getRandom64x64()); fx.quality = QUALITY_LINEAR; fx.sampleFlag = SAMPLEMODE_MIRROR; diff --git a/WickedEngine/ssao.hlsl b/WickedEngine/ssao.hlsl index 9f6ebcc3c..e11885bc0 100644 --- a/WickedEngine/ssao.hlsl +++ b/WickedEngine/ssao.hlsl @@ -44,6 +44,9 @@ inline float3x3 GetTangentSpace(float3 normal) float4 main(VertexToPixelPostProcess input):SV_Target { + const float range = xPPParams0.x; + const uint sampleCount = xPPParams0.y; + float3 noise = xMaskTex.Load(int3((64 * input.tex.xy * 400) % 64, 0)).xyz * 2.0 - 1.0; float3 normal = decode(texture_gbuffer1.SampleLevel(sampler_linear_clamp, input.tex, 0).xy); float3 P = getPosition(input.tex, texture_depth.SampleLevel(sampler_point_clamp, input.tex, 0)); @@ -53,27 +56,25 @@ float4 main(VertexToPixelPostProcess input):SV_Target float3x3 tangentSpace = float3x3(tangent, bitangent, normal); float center_depth = texture_lineardepth.SampleLevel(sampler_point_clamp, input.tex, 0); + center_depth -= 0.0006f; // self-occlusion bias float ao = 0; - - const uint sampleCount = 16; for (uint i = 0; i < sampleCount; ++i) { float2 hamm = hammersley2d(i, sampleCount); float3 hemisphere = hemisphereSample_uniform(hamm.x, hamm.y); float3 cone = mul(hemisphere, tangentSpace); - float3 sam = P + cone; + float3 sam = P + cone * range; float4 vProjectedCoord = mul(float4(sam, 1.0f), g_xCamera_VP); vProjectedCoord.xy /= vProjectedCoord.w; vProjectedCoord.xy = vProjectedCoord.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); float ray_depth = texture_lineardepth.SampleLevel(sampler_point_clamp, vProjectedCoord.xy, 0); - ray_depth += 0.0008f; // self-occlusion bias - float depth_fix = 1 - saturate(abs(center_depth - ray_depth) * 200); // to much depth difference cancels the effect + float depth_fix = 1 - saturate(abs(center_depth - ray_depth) * 200); // too much depth difference cancels the effect - ao += (ray_depth <= center_depth ? 1 : 0) * depth_fix; + ao += (ray_depth < center_depth ? 1 : 0) * depth_fix; } ao /= (float)sampleCount; diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index 7fdf3e5cd..d9843448e 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -279,6 +279,9 @@ namespace wiImage case wiImageParams::PostProcess::FXAA: break; case wiImageParams::PostProcess::SSAO: + prcb.xPPParams0.x = params.process.params.ssao.range; + prcb.xPPParams0.y = (float)params.process.params.ssao.sampleCount; + device->UpdateBuffer(&processCb, &prcb, threadID); break; case wiImageParams::PostProcess::SSSS: prcb.xPPParams0.x = params.process.params.ssss.x; diff --git a/WickedEngine/wiImage.h b/WickedEngine/wiImage.h index e78836821..53f1564af 100644 --- a/WickedEngine/wiImage.h +++ b/WickedEngine/wiImage.h @@ -134,6 +134,11 @@ struct wiImageParams } blur; Blur ssss; Blur sun; + struct SSAO + { + float range; + UINT sampleCount; + } ssao; float dofStrength; float sharpen; float exposure; @@ -156,7 +161,7 @@ struct wiImageParams params.outline.colorB = color.z; } void setFXAA() { type = FXAA; } - void setSSAO() { type = SSAO; } + void setSSAO(float range = 1.0f, UINT sampleCount = 16) { type = SSAO; params.ssao.range = range; params.ssao.sampleCount = sampleCount; } void setLinDepth() { type = LINEARDEPTH; } void setColorGrade() { type = COLORGRADE; } void setSSSS(const XMFLOAT2& value) { type = SSSS; params.ssss.x = value.x; params.ssss.y = value.y; } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 54f994ab3..080f40b0b 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 24; // minor bug fixes, alterations, refactors, updates - const int revision = 26; + const int revision = 27; long GetVersion()