From 1b41ef78cd0975da1ab016dc850949bc53db0e4b Mon Sep 17 00:00:00 2001 From: Pixelflinger Date: Wed, 22 May 2019 17:23:03 -0700 Subject: [PATCH] Use depth culling when computing SSAO Since we have a depth buffer, we might as well use it for depth-culling, this automatically discards the skybox's fragments -- which we can assume won't participate in SSAO. --- filament/src/PostProcessManager.cpp | 5 ++++- filament/src/materials/sao.mat | 3 ++- filament/src/materials/ssao.mat | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/filament/src/PostProcessManager.cpp b/filament/src/PostProcessManager.cpp index 684eba099e..5868dd532d 100644 --- a/filament/src/PostProcessManager.cpp +++ b/filament/src/PostProcessManager.cpp @@ -339,7 +339,9 @@ FrameGraphResource PostProcessManager::ssao(FrameGraph& fg, RenderPass& pass, .format = TextureFormat::R8 }); data.ssao = builder.useRenderTarget("SSAO Target", - { .attachments.color = data.ssao }, TargetBufferFlags::NONE).color; + { .attachments.color = data.ssao, + .attachments.depth = { data.depth, FrameGraphRenderTarget::Attachments::READ } + }, TargetBufferFlags::NONE).color; }, [this, fullScreenRenderPrimitive](FrameGraphPassResources const& resources, SSAOPassData const& data, DriverApi& driver) { @@ -363,6 +365,7 @@ FrameGraphResource PostProcessManager::ssao(FrameGraph& fg, RenderPass& pass, PipelineState pipeline; pipeline.program = mSSAOProgram; pipeline.rasterState = mSSAOMaterial->getRasterState(); + pipeline.rasterState.depthFunc = RasterState::DepthFunc::G; driver.beginRenderPass(ssao.target, ssao.params); driver.draw(pipeline, fullScreenRenderPrimitive); diff --git a/filament/src/materials/sao.mat b/filament/src/materials/sao.mat index 997a868ca5..af7bb00221 100644 --- a/filament/src/materials/sao.mat +++ b/filament/src/materials/sao.mat @@ -36,7 +36,7 @@ material { ], vertexDomain : device, depthWrite : false, - depthCulling : false, + depthCulling : true, shadingModel : unlit, variantFilter : [ skinning ], culling: none @@ -46,6 +46,7 @@ vertex { void materialVertex(inout MaterialVertexInputs material) { // far-plane in view space vec4 position = getPosition(); // clip-space + position.z = 1.0; // far plane material.vertex.xy = (position.xy * 0.5 + 0.5); material.vertex.zw = position.xy; } diff --git a/filament/src/materials/ssao.mat b/filament/src/materials/ssao.mat index eb7600b942..63d5d8772c 100644 --- a/filament/src/materials/ssao.mat +++ b/filament/src/materials/ssao.mat @@ -36,7 +36,7 @@ material { ], vertexDomain : device, depthWrite : false, - depthCulling : false, + depthCulling : true, shadingModel : unlit, variantFilter : [ skinning ], culling: none @@ -46,6 +46,7 @@ vertex { void materialVertex(inout MaterialVertexInputs material) { // far-plane in view space vec4 position = getPosition(); // clip-space + position.z = 1.0; // far plane material.vertex.xy = (position.xy * 0.5 + 0.5); material.vertex.zw = position.xy; }