From 9899eb6d3ff5a066c1c55bc2c30ed7c27f8c2cb4 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 25 Sep 2018 15:46:07 +0200 Subject: [PATCH] Concentrating on resolution level 1 --- .../src/AmbientOcclusionEffect.cpp | 74 ++++++++++--------- libraries/render-utils/src/ssao.slh | 13 ++-- .../render-utils/src/ssao_makeOcclusion.slf | 2 +- 3 files changed, 48 insertions(+), 41 deletions(-) diff --git a/libraries/render-utils/src/AmbientOcclusionEffect.cpp b/libraries/render-utils/src/AmbientOcclusionEffect.cpp index 5a1a168894..1574a643db 100644 --- a/libraries/render-utils/src/AmbientOcclusionEffect.cpp +++ b/libraries/render-utils/src/AmbientOcclusionEffect.cpp @@ -89,6 +89,8 @@ void AmbientOcclusionFramebuffer::allocate() { auto height = _frameSize.y; auto format = gpu::Element::COLOR_R_8; + //TEMPO OP + format = gpu::Element::VEC4F_COLOR_RGBA; _occlusionTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR, gpu::Sampler::WRAP_CLAMP)); _occlusionFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("occlusion")); _occlusionFramebuffer->setRenderBuffer(0, _occlusionTexture); @@ -111,7 +113,8 @@ void AmbientOcclusionFramebuffer::allocate() { auto width = sideSize.x; auto height = sideSize.y; auto format = gpu::Element::COLOR_RGBA_32; - _normalTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_LINEAR, gpu::Sampler::WRAP_CLAMP)); + _normalTexture = gpu::Texture::createRenderBuffer(format, width, height, gpu::Texture::SINGLE_MIP, + gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_POINT, gpu::Sampler::WRAP_CLAMP)); _normalFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("ssaoNormals")); _normalFramebuffer->setRenderBuffer(0, _normalTexture); } @@ -221,7 +224,7 @@ AmbientOcclusionEffectConfig::AmbientOcclusionEffectConfig() : #else numSamples{ 16 }, #endif - resolutionLevel{ 2 }, + resolutionLevel{ 1 }, blurRadius{ 4 }, ditheringEnabled{ true }, borderingEnabled{ true }, @@ -395,7 +398,7 @@ const gpu::PipelinePointer& AmbientOcclusionEffect::getOcclusionPipeline() { gpu::ShaderPointer program = gpu::Shader::createProgram(shader::render_utils::program::ssao_makeOcclusion); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setColorWriteMask(true, true, true, false); + state->setColorWriteMask(true, true, true, true); // Good to go add the brand new pipeline _occlusionPipeline = gpu::Pipeline::create(program, state); @@ -585,18 +588,13 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte batch.setUniformBuffer(render_utils::slot::buffer::DeferredFrameTransform, frameTransform->getFrameTransformBuffer()); batch.setUniformBuffer(render_utils::slot::buffer::SsaoParams, _aoParametersBuffer); -#if SSAO_USE_QUAD_SPLIT - batch.setFramebuffer(occlusionBlurredFBO); -#else - batch.setFramebuffer(occlusionFBO); -#endif batch.setPipeline(occlusionPipeline); batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, occlusionDepthTexture); #if SSAO_USE_QUAD_SPLIT batch.setResourceTexture(render_utils::slot::texture::SsaoNormal, occlusionNormalTexture); { - const auto scale = glm::vec3( + const auto uvScale = glm::vec3( (splitSize.x * 2.0f * depthResolutionScale) / (occlusionDepthSize.x * resolutionScale), (splitSize.y * 2.0f * depthResolutionScale) / (occlusionDepthSize.y * resolutionScale), 1.0f); @@ -604,7 +602,7 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte batch.setViewportTransform(splitViewport); - model.setScale(scale); + model.setScale(uvScale); model.setTranslation(glm::vec3(-pixelOffset.x, -pixelOffset.y, 0.0f)); batch.setModelTransform(model); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(0)); @@ -612,27 +610,34 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte batch.draw(gpu::TRIANGLE_STRIP, 4); model.setTranslation(glm::vec3(pixelOffset.x, -pixelOffset.y, 0.0f)); + batch.setModelTransform(model); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(1)); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[1]); batch.draw(gpu::TRIANGLE_STRIP, 4); model.setTranslation(glm::vec3(pixelOffset.x, pixelOffset.y, 0.0f)); + batch.setModelTransform(model); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(3)); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[2]); batch.draw(gpu::TRIANGLE_STRIP, 4); model.setTranslation(glm::vec3(-pixelOffset.x, pixelOffset.y, 0.0f)); + batch.setModelTransform(model); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(2)); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[3]); batch.draw(gpu::TRIANGLE_STRIP, 4); } #else - const auto scale = glm::vec3( - occlusionViewport.z / (framebufferSize.x * resolutionScale), - occlusionViewport.w / (framebufferSize.y * resolutionScale), - 1.0f); - model.setScale(scale); batch.setViewportTransform(occlusionViewport); + { + const auto uvScale = glm::vec3( + (occlusionViewport.z * depthResolutionScale) / (occlusionDepthSize.x * resolutionScale), + (occlusionViewport.w * depthResolutionScale) / (occlusionDepthSize.y * resolutionScale), + 1.0f); + model.setScale(uvScale); + } + batch.setModelTransform(model); + batch.setFramebuffer(occlusionFBO); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[0]); batch.draw(gpu::TRIANGLE_STRIP, 4); #endif @@ -655,34 +660,35 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte PROFILE_RANGE_BATCH(batch, "Bilateral Blur"); // Blur 1st pass batch.pushProfileRange("Horizontal"); - model.setScale(resolutionScale); - batch.setModelTransform(model); - batch.setViewportTransform(firstBlurViewport); - batch.setFramebuffer(occlusionBlurredFBO); - // Use full resolution depth and normal for bilateral upscaling and blur - batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, linearDepthTexture); - batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _hblurParametersBuffer); - batch.setPipeline(firstHBlurPipeline); - batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionFBO->getRenderBuffer(0)); - batch.draw(gpu::TRIANGLE_STRIP, 4); + model.setScale(resolutionScale); + batch.setModelTransform(model); + batch.setViewportTransform(firstBlurViewport); + batch.setFramebuffer(occlusionBlurredFBO); + // Use full resolution depth and normal for bilateral upscaling and blur + batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, linearDepthTexture); + batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _hblurParametersBuffer); + batch.setPipeline(firstHBlurPipeline); + batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionFBO->getRenderBuffer(0)); + batch.draw(gpu::TRIANGLE_STRIP, 4); batch.popProfileRange(); // Blur 2nd pass batch.pushProfileRange("Vertical"); - model.setScale(glm::vec3(1.0f, resolutionScale, 1.0f)); - batch.setModelTransform(model); - batch.setViewportTransform(sourceViewport); - batch.setFramebuffer(occlusionFBO); - batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _vblurParametersBuffer); - batch.setPipeline(lastVBlurPipeline); - batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionBlurredFBO->getRenderBuffer(0)); - batch.draw(gpu::TRIANGLE_STRIP, 4); + model.setScale(glm::vec3(1.0f, resolutionScale, 1.0f)); + batch.setModelTransform(model); + batch.setViewportTransform(sourceViewport); + batch.setFramebuffer(occlusionFBO); + batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _vblurParametersBuffer); + batch.setPipeline(lastVBlurPipeline); + batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionBlurredFBO->getRenderBuffer(0)); + batch.draw(gpu::TRIANGLE_STRIP, 4); batch.popProfileRange(); } batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, nullptr); + batch.setResourceTexture(render_utils::slot::texture::SsaoNormal, nullptr); batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, nullptr); - + _gpuTimer->end(batch); }); diff --git a/libraries/render-utils/src/ssao.slh b/libraries/render-utils/src/ssao.slh index 468e3fc7d1..345eeebafb 100644 --- a/libraries/render-utils/src/ssao.slh +++ b/libraries/render-utils/src/ssao.slh @@ -275,7 +275,7 @@ vec2 fetchTap(ivec4 side, vec2 tapUV, float tapRadius) { vec3 buildPosition(ivec4 side, vec2 fragUVPos) { vec2 fetchUV = clamp(fragUVPos, vec2(0), vec2(1)); - fetchUV = mix(fetchUV, vec2((fetchUV.x + getStereoSide(side)) * 0.5, fetchUV.y), isStereo()); + fetchUV.x = mix(fetchUV.x, (fetchUV.x + getStereoSide(side)) * 0.5, isStereo()); float Zeye = getZEyeAtUV(fetchUV, 0); return evalEyePositionFromZeye(side.x, Zeye, fragUVPos); } @@ -354,9 +354,9 @@ float computeHorizonFromTap(vec3 tapPositionES, vec3 fragPositionES, vec3 fragNo #define HBAO_HORIZON_SEARCH_CONSTANT_STEP 0 -float computeHorizon(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, vec3 fragNormalES, vec2 searchVec, float searchRadius) { +float computeHorizon(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, vec3 fragNormalES, vec2 searchVec, vec2 pixelSearchVec, float searchRadius) { vec2 absSearchVec = abs(searchVec); - int stepCount = int(ceil(searchRadius)); + int stepCount = int(ceil(max(pixelSearchVec.x, pixelSearchVec.y))); float cosHorizonAngle = 0.0; if (stepCount>0) { @@ -399,14 +399,15 @@ float computeHorizon(ivec4 side, vec2 fragUVPos, vec3 fragPositionES, vec3 fragN float evalVisibilityHBAO(ivec4 side, vec2 fragUVPos, vec2 invSideImageSize, vec2 deltaTap, float diskPixelRadius, vec3 fragPositionES, vec3 fragNormalES) { - vec2 searchVec = (deltaTap * diskPixelRadius) * invSideImageSize; + vec2 pixelSearchVec = deltaTap * diskPixelRadius; + vec2 searchVec = pixelSearchVec * invSideImageSize; float obscurance = 0.0; // Forward search for h1 - obscurance = computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, searchVec, diskPixelRadius); + obscurance = computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, searchVec, pixelSearchVec, diskPixelRadius); // Backward search for h2 - obscurance += computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, -searchVec, diskPixelRadius); + obscurance += computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, -searchVec, pixelSearchVec, diskPixelRadius); return obscurance; } diff --git a/libraries/render-utils/src/ssao_makeOcclusion.slf b/libraries/render-utils/src/ssao_makeOcclusion.slf index 044d11910a..0a34b0df03 100644 --- a/libraries/render-utils/src/ssao_makeOcclusion.slf +++ b/libraries/render-utils/src/ssao_makeOcclusion.slf @@ -43,7 +43,7 @@ void main(void) { fragUVPos.x = mix(fragUVPos.x, fragUVPos.x * 2.0 - getStereoSide(side), isStereo()); // The position and normal of the pixel fragment in Eye space - vec2 deltaDepthUV = vec2(1.0) / sideDepthSize; + vec2 deltaDepthUV = vec2(2.0) / sideDepthSize; vec3 fragPositionES = buildPosition(side, fragUVPos); #if !SSAO_USE_QUAD_SPLIT vec3 fragNormalES = buildNormal(side, fragUVPos, fragPositionES, deltaDepthUV);