diff --git a/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp index 42fd34e52..c692b9809 100644 --- a/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp +++ b/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp @@ -697,11 +697,6 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW ssaoUniforms.Scale = sceneScale; ssaoUniforms.Offset = sceneOffset; - DepthBlurUniforms blurUniforms; - blurUniforms.BlurSharpness = blurSharpness; - blurUniforms.InvFullResolution = { 1.0f / AmbientWidth, 1.0f / AmbientHeight }; - blurUniforms.PowExponent = gl_ssao_exponent; - AmbientCombineUniforms combineUniforms; combineUniforms.SampleCount = gl_multisample; combineUniforms.Scale = screen->SceneScale(); @@ -740,6 +735,11 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW // Blur SSAO texture if (gl_ssao_debug < 2) { + DepthBlurUniforms blurUniforms; + blurUniforms.BlurSharpness = blurSharpness; + blurUniforms.PowExponent = gl_ssao_exponent; + blurUniforms.InvFullResolution = { 1.0f / AmbientWidth, 0.0f }; + renderstate->Clear(); renderstate->Shader = &BlurHorizontal; renderstate->Uniforms.Set(blurUniforms); @@ -749,9 +749,15 @@ void PPAmbientOcclusion::Render(PPRenderState *renderstate, float m5, int sceneW renderstate->SetNoBlend(); renderstate->Draw(); + blurUniforms.InvFullResolution = { 0.0f, 1.0f / AmbientHeight }; + + renderstate->Clear(); renderstate->Shader = &BlurVertical; + renderstate->Uniforms.Set(blurUniforms); + renderstate->Viewport = ambientViewport; renderstate->SetInputTexture(0, &Ambient1); renderstate->SetOutputTexture(&Ambient0); + renderstate->SetNoBlend(); renderstate->Draw(); } diff --git a/wadsrc/static/shaders/glsl/depthblur.fp b/wadsrc/static/shaders/glsl/depthblur.fp index b1c005707..299b63694 100644 --- a/wadsrc/static/shaders/glsl/depthblur.fp +++ b/wadsrc/static/shaders/glsl/depthblur.fp @@ -6,61 +6,48 @@ layout(binding=0) uniform sampler2D AODepthTexture; #define KERNEL_RADIUS 3.0 -float CrossBilateralWeight(float r, float sampleDepth, float centerDepth) +void main() { const float blurSigma = KERNEL_RADIUS * 0.5; const float blurFalloff = 1.0 / (2.0 * blurSigma * blurSigma); - float deltaZ = (sampleDepth - centerDepth) * BlurSharpness; + vec2 centerSample = texture(AODepthTexture, TexCoord).xy; - return exp2(-r * r * blurFalloff - deltaZ * deltaZ); -} - -void ProcessSample(float ao, float z, float r, float centerDepth, inout float totalAO, inout float totalW) -{ - float w = CrossBilateralWeight(r, z, centerDepth); - totalAO += w * ao; - totalW += w; -} - -void ProcessRadius(vec2 deltaUV, float centerDepth, inout float totalAO, inout float totalW) -{ - for (float r = 1; r <= KERNEL_RADIUS; r += 1.0) - { - vec2 uv = r * deltaUV + TexCoord; - vec2 aoZ = texture(AODepthTexture, uv).xy; - ProcessSample(aoZ.x, aoZ.y, r, centerDepth, totalAO, totalW); - } -} - -vec2 ComputeBlur(vec2 deltaUV) -{ - vec2 aoZ = texture(AODepthTexture, TexCoord).xy; - - float totalAO = aoZ.x; + float centerDepth = centerSample.y; + float totalAO = centerSample.x; float totalW = 1.0; - ProcessRadius(deltaUV, aoZ.y, totalAO, totalW); - ProcessRadius(-deltaUV, aoZ.y, totalAO, totalW); + for (float r = 1.0; r <= KERNEL_RADIUS; r += 1.0) + { + vec4 blurSample = texture(AODepthTexture, TexCoord - InvFullResolution * r); + float ao = blurSample.x; + float z = blurSample.y; - return vec2(totalAO / totalW, aoZ.y); -} + float deltaZ = (z - centerDepth) * BlurSharpness; + float w = exp2(-r * r * blurFalloff - deltaZ * deltaZ); -vec2 BlurX() -{ - return ComputeBlur(vec2(InvFullResolution.x, 0.0)); -} + totalAO += w * ao; + totalW += w; + } -float BlurY() -{ - return pow(clamp(ComputeBlur(vec2(0.0, InvFullResolution.y)).x, 0.0, 1.0), PowExponent); -} + for (float r = 1.0; r <= KERNEL_RADIUS; r += 1.0) + { + vec4 blurSample = texture(AODepthTexture, InvFullResolution * r + TexCoord); + float ao = blurSample.x; + float z = blurSample.y; + + float deltaZ = (z - centerDepth) * BlurSharpness; + float w = exp2(-r * r * blurFalloff - deltaZ * deltaZ); + + totalAO += w * ao; + totalW += w; + } + + float fragAO = totalAO / totalW; -void main() -{ #if defined(BLUR_HORIZONTAL) - FragColor = vec4(BlurX(), 0.0, 1.0); + FragColor = vec4(fragAO, centerDepth, 0.0, 1.0); #else - FragColor = vec4(BlurY(), 0.0, 0.0, 1.0); + FragColor = vec4(pow(clamp(fragAO, 0.0, 1.0), PowExponent), 0.0, 0.0, 1.0); #endif }