From fbd158938ba578e7f5ae217476f62567ba24d8f4 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Fri, 28 Sep 2018 11:31:09 +0200 Subject: [PATCH] Put some bilateral blur computation on CPU --- .../src/AmbientOcclusionEffect.cpp | 42 +++++++++++-------- libraries/render-utils/src/ssao.slh | 2 - .../render-utils/src/ssao_bilateralBlur.slf | 14 +++---- libraries/render-utils/src/ssao_shared.h | 2 + 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index b0b371a715..1df3da2b70 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -229,7 +229,7 @@ AmbientOcclusionEffect::AOParameters::AOParameters() { } AmbientOcclusionEffect::BlurParameters::BlurParameters() { - _blurInfo = { 1.0f, 3.0f, 2.0f, 0.0f }; + _blurInfo = { 1.0f, 2.0f, 0.0f, 3.0f }; } AmbientOcclusionEffect::AmbientOcclusionEffect() { @@ -268,11 +268,26 @@ void AmbientOcclusionEffect::configure(const Config& config) { current.y = 1.0f / (1.0f - config.falloffAngle); } - if (config.edgeSharpness != _hblurParametersBuffer.get().getEdgeSharpness()) { + // Update bilateral blur + { + const float BLUR_EDGE_DISTANCE_SCALE = float(10000 * SSAO_DEPTH_KEY_SCALE); + const float BLUR_EDGE_NORMAL_SCALE = 2.0f; + auto& hblur = _hblurParametersBuffer.edit()._blurInfo; auto& vblur = _vblurParametersBuffer.edit()._blurInfo; - hblur.x = config.edgeSharpness; - vblur.x = config.edgeSharpness; + float blurRadialSigma = float(config.blurRadius) * 0.5f; + float blurRadialScale = 1.0f / (2.0f*blurRadialSigma*blurRadialSigma); + glm::vec3 blurScales = -glm::vec3(blurRadialScale, glm::vec2(BLUR_EDGE_DISTANCE_SCALE, BLUR_EDGE_NORMAL_SCALE) * config.edgeSharpness); + + hblur.x = blurScales.x; + hblur.y = blurScales.y; + hblur.z = blurScales.z; + hblur.w = (float)config.blurRadius; + + vblur.x = blurScales.x; + vblur.y = blurScales.y; + vblur.z = blurScales.z; + vblur.w = (float)config.blurRadius; } if (config.numSpiralTurns != _aoParametersBuffer->getNumSpiralTurns()) { @@ -322,13 +337,6 @@ void AmbientOcclusionEffect::configure(const Config& config) { current.x = (float)config.resolutionLevel; shouldUpdateBlurs = true; } - - if (config.blurRadius != _hblurParametersBuffer.get().getBlurRadius()) { - auto& hblur = _hblurParametersBuffer.edit()._blurInfo; - auto& vblur = _vblurParametersBuffer.edit()._blurInfo; - hblur.y = (float)config.blurRadius; - vblur.y = (float)config.blurRadius; - } if (config.ditheringEnabled != _aoParametersBuffer->isDitheringEnabled()) { auto& current = _aoParametersBuffer.edit()._ditheringInfo; @@ -357,18 +365,18 @@ void AmbientOcclusionEffect::updateBlurParameters() { const auto occlusionSize = divideRoundUp(frameSize, resolutionScale); // Occlusion UV limit - hblur._blurInfo.z = occlusionSize.x / float(frameSize.x); - hblur._blurInfo.w = occlusionSize.y / float(frameSize.y); + hblur._blurAxis.z = occlusionSize.x / float(frameSize.x); + hblur._blurAxis.w = occlusionSize.y / float(frameSize.y); - vblur._blurInfo.z = 1.0f; - vblur._blurInfo.w = occlusionSize.y / float(frameSize.y); + vblur._blurAxis.z = 1.0f; + vblur._blurAxis.w = occlusionSize.y / float(frameSize.y); // Occlusion axis - hblur._blurAxis.x = hblur._blurInfo.z / occlusionSize.x; + hblur._blurAxis.x = hblur._blurAxis.z / occlusionSize.x; hblur._blurAxis.y = 0.0f; vblur._blurAxis.x = 0.0f; - vblur._blurAxis.y = vblur._blurInfo.w / occlusionSize.y; + vblur._blurAxis.y = vblur._blurAxis.w / occlusionSize.y; } void AmbientOcclusionEffect::updateFramebufferSizes() { diff --git a/libraries/render-utils/src/ssao.slh b/libraries/render-utils/src/ssao.slh index a02554a385..c72d1f4c0d 100644 --- a/libraries/render-utils/src/ssao.slh +++ b/libraries/render-utils/src/ssao.slh @@ -16,8 +16,6 @@ <@func declarePackOcclusionDepth()@> -#define SSAO_DEPTH_KEY_SCALE 300.0 - float CSZToDepthKey(float z) { return clamp(z * (-1.0 / SSAO_DEPTH_KEY_SCALE), 0.0, 1.0); } diff --git a/libraries/render-utils/src/ssao_bilateralBlur.slf b/libraries/render-utils/src/ssao_bilateralBlur.slf index dc708b137b..e89d696cbb 100644 --- a/libraries/render-utils/src/ssao_bilateralBlur.slf +++ b/libraries/render-utils/src/ssao_bilateralBlur.slf @@ -31,15 +31,15 @@ vec2 getBlurOcclusionAxis() { } vec2 getBlurOcclusionUVLimit() { - return blurParams._blurInfo.zw; + return blurParams._blurAxis.zw; } -float getBlurEdgeSharpness() { - return blurParams._blurInfo.x; +vec3 getBlurScales() { + return blurParams._blurInfo.xyz; } int getBlurRadius() { - return int(blurParams._blurInfo.y); + return int(blurParams._blurInfo.w); } vec4 fetchOcclusionPacked(ivec4 side, vec2 texCoord) { @@ -52,8 +52,6 @@ float evalBlurCoefficient(vec3 blurScales, float radialDistance, float zDistance return exp2(dot(blurScales, distances*distances)); } -const float BLUR_EDGE_DISTANCE_SCALE = 10000 * SSAO_DEPTH_KEY_SCALE; -const float BLUR_EDGE_NORMAL_SCALE = 2.0; const float BLUR_EDGE_NORMAL_LIMIT = 0.25; vec2 evalTapWeightedValue(vec3 blurScales, ivec4 side, int r, vec2 occlusionTexCoord, vec2 depthTexCoord, float fragDepth, vec3 fragNormal) { @@ -98,9 +96,7 @@ vec4 getBlurredOcclusion(ivec2 destPixelCoord, vec2 occlusionTexCoord, vec2 dept // Accumulate weighted contributions along the bluring axis in the [-radius, radius] range int blurRadius = getBlurRadius(); - float blurRadialSigma = float(blurRadius) * 0.5; - float blurRadialScale = 1.0 / (2.0*blurRadialSigma*blurRadialSigma); - vec3 blurScales = -vec3(blurRadialScale, vec2(BLUR_EDGE_DISTANCE_SCALE, BLUR_EDGE_NORMAL_SCALE) * getBlurEdgeSharpness()); + vec3 blurScales = getBlurScales(); // negative side first for (int r = -blurRadius; r <= -1; ++r) { diff --git a/libraries/render-utils/src/ssao_shared.h b/libraries/render-utils/src/ssao_shared.h index 667dd702ef..1552a38947 100644 --- a/libraries/render-utils/src/ssao_shared.h +++ b/libraries/render-utils/src/ssao_shared.h @@ -17,6 +17,8 @@ #define SSAO_USE_QUAD_SPLIT 1 #define SSAO_BILATERAL_BLUR_USE_NORMAL 0 +#define SSAO_DEPTH_KEY_SCALE 300.0 + #if SSAO_USE_QUAD_SPLIT #define SSAO_SPLIT_LOG2_COUNT 2 #else