diff --git a/examples/utilities/tools/renderEngineDebug.js b/examples/utilities/tools/renderEngineDebug.js index 645982ff2c..5d38561eda 100755 --- a/examples/utilities/tools/renderEngineDebug.js +++ b/examples/utilities/tools/renderEngineDebug.js @@ -129,6 +129,11 @@ panel.newCheckbox("Ambient Occlusion Dithering", function() { return Render.ambientOcclusion.ditheringEnabled; }, function (value) { return (value); }); +panel.newSlider("Ambient Occlusion Falloff Bias", 0.0, 0.2, + function (value) { Render.ambientOcclusion.falloffBias = value; }, + function() { return Render.ambientOcclusion.falloffBias; }, + function (value) { return (value.toFixed(2)); }); + panel.newSlider("Ambient Occlusion Edge Sharpness", 0.0, 1.0, function (value) { Render.ambientOcclusion.edgeSharpness = value; }, function() { return Render.ambientOcclusion.edgeSharpness; }, diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index d2ef8fc222..2020add89b 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -246,6 +246,15 @@ void AmbientOcclusionEffect::setDithering(bool enabled) { } } +void AmbientOcclusionEffect::setFalloffBias(float bias) { + bias = std::max(0.0f, std::min(bias, 0.2f)); + if (bias != getFalloffBias()) { + auto& current = _parametersBuffer.edit()._ditheringInfo; + current.z = (float)bias; + } +} + + void AmbientOcclusionEffect::setNumSamples(int numSamples) { numSamples = std::max(1.f, (float) numSamples); if (numSamples != getNumSamples()) { diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.h b/libraries/render-utils/src/AmbientOcclusionEffect.h index e80c5b0136..89401eaa42 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.h +++ b/libraries/render-utils/src/AmbientOcclusionEffect.h @@ -37,6 +37,10 @@ public: void setDithering(bool enabled); bool isDitheringEnabled() const { return _parametersBuffer.get()._ditheringInfo.x; } + // Faloff Bias + void setFalloffBias(float bias); + int getFalloffBias() const { return (int)_parametersBuffer.get()._ditheringInfo.z; } + // Number of samples per pixel to evaluate the Obscurance void setNumSamples(int numSamples); int getNumSamples() const { return (int)_parametersBuffer.get()._sampleInfo.x; } @@ -94,8 +98,8 @@ private: glm::vec4 _resolutionInfo{ -1.0, 0.0, 0.0, 0.0 }; // radius info is { R, R^2, 1 / R^6, ObscuranceScale} glm::vec4 _radiusInfo{ 0.5, 0.5 * 0.5, 1.0 / (0.25 * 0.25 * 0.25), 1.0 }; - // Dithering info - glm::vec4 _ditheringInfo{ 0.0, 0.0, 0.0, 0.0 }; + // Dithering info + glm::vec4 _ditheringInfo{ 0.0, 0.0, 0.01, 0.0 }; // Sampling info glm::vec4 _sampleInfo{ 11.0, 1.0/11.0, 7.0, 1.0 }; // Blurring info diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index fa15abe086..1adf350f96 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -180,6 +180,7 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend _jobs[_occlusionJobIndex].edit().setNumSamples(renderContext->getAmbientOcclusion().numSamples); _jobs[_occlusionJobIndex].edit().setNumSpiralTurns(renderContext->getAmbientOcclusion().numSpiralTurns); _jobs[_occlusionJobIndex].edit().setDithering(renderContext->getAmbientOcclusion().ditheringEnabled); + _jobs[_occlusionJobIndex].edit().setFalloffBias(renderContext->getAmbientOcclusion().falloffBias); _jobs[_occlusionJobIndex].edit().setEdgeSharpness(renderContext->getAmbientOcclusion().edgeSharpness); _jobs[_occlusionJobIndex].edit().setBlurRadius(renderContext->getAmbientOcclusion().blurRadius); _jobs[_occlusionJobIndex].edit().setBlurDeviation(renderContext->getAmbientOcclusion().blurDeviation); diff --git a/libraries/render-utils/src/RenderScriptingInterface.h b/libraries/render-utils/src/RenderScriptingInterface.h index 41448f06c6..947240fea6 100644 --- a/libraries/render-utils/src/RenderScriptingInterface.h +++ b/libraries/render-utils/src/RenderScriptingInterface.h @@ -76,6 +76,7 @@ namespace RenderScripting { Q_PROPERTY(int numSamples MEMBER numSamples) Q_PROPERTY(float numSpiralTurns MEMBER numSpiralTurns) Q_PROPERTY(bool ditheringEnabled MEMBER ditheringEnabled) + Q_PROPERTY(float falloffBias MEMBER falloffBias) Q_PROPERTY(float edgeSharpness MEMBER edgeSharpness) Q_PROPERTY(int blurRadius MEMBER blurRadius) Q_PROPERTY(float blurDeviation MEMBER blurDeviation) diff --git a/libraries/render-utils/src/ssao.slh b/libraries/render-utils/src/ssao.slh index 3cf24f2ebd..811898a803 100644 --- a/libraries/render-utils/src/ssao.slh +++ b/libraries/render-utils/src/ssao.slh @@ -113,6 +113,9 @@ float getFrameDithering() { return params._ditheringInfo.y; } +float getFalloffBias() { + return params._ditheringInfo.z; +} float getNumSamples() { return params._sampleInfo.x; diff --git a/libraries/render-utils/src/ssao_makeOcclusion.slf b/libraries/render-utils/src/ssao_makeOcclusion.slf index a765372e09..f9abde9791 100644 --- a/libraries/render-utils/src/ssao_makeOcclusion.slf +++ b/libraries/render-utils/src/ssao_makeOcclusion.slf @@ -84,13 +84,10 @@ float sampleAO(in ivec2 side, in ivec2 ssC, in vec3 C, in vec3 n_C, in float ssD float vv = dot(v, v); float vn = dot(v, n_C); - const float bias = 0.01; - const float epsilon = 0.01; - float radius2 = getRadius2(); - // Fall off function as recommended in SAO paper - float f = max(radius2 - vv, 0.0); - return f * f * f * max((vn - bias) / (epsilon + vv), 0.0); + const float epsilon = 0.01; + float f = max(getRadius2() - vv, 0.0); + return f * f * f * max((vn - getFalloffBias()) / (epsilon + vv), 0.0); } void main(void) { diff --git a/libraries/render/src/render/Context.h b/libraries/render/src/render/Context.h index 91311e9eff..c438a91049 100644 --- a/libraries/render/src/render/Context.h +++ b/libraries/render/src/render/Context.h @@ -80,6 +80,7 @@ public: int numSamples = 11; // Num Samples per pixel float numSpiralTurns = 7.0f; bool ditheringEnabled = true; + float falloffBias = 0.01f; float edgeSharpness = 1.0f; int blurRadius = 4; float blurDeviation = 2.5f;