Concentrating on resolution level 1

This commit is contained in:
Olivier Prat 2018-09-25 15:46:07 +02:00
parent 60f5913002
commit 9899eb6d3f
3 changed files with 48 additions and 41 deletions

View file

@ -89,6 +89,8 @@ void AmbientOcclusionFramebuffer::allocate() {
auto height = _frameSize.y; auto height = _frameSize.y;
auto format = gpu::Element::COLOR_R_8; 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)); _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 = gpu::FramebufferPointer(gpu::Framebuffer::create("occlusion"));
_occlusionFramebuffer->setRenderBuffer(0, _occlusionTexture); _occlusionFramebuffer->setRenderBuffer(0, _occlusionTexture);
@ -111,7 +113,8 @@ void AmbientOcclusionFramebuffer::allocate() {
auto width = sideSize.x; auto width = sideSize.x;
auto height = sideSize.y; auto height = sideSize.y;
auto format = gpu::Element::COLOR_RGBA_32; 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 = gpu::FramebufferPointer(gpu::Framebuffer::create("ssaoNormals"));
_normalFramebuffer->setRenderBuffer(0, _normalTexture); _normalFramebuffer->setRenderBuffer(0, _normalTexture);
} }
@ -221,7 +224,7 @@ AmbientOcclusionEffectConfig::AmbientOcclusionEffectConfig() :
#else #else
numSamples{ 16 }, numSamples{ 16 },
#endif #endif
resolutionLevel{ 2 }, resolutionLevel{ 1 },
blurRadius{ 4 }, blurRadius{ 4 },
ditheringEnabled{ true }, ditheringEnabled{ true },
borderingEnabled{ 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::ShaderPointer program = gpu::Shader::createProgram(shader::render_utils::program::ssao_makeOcclusion);
gpu::StatePointer state = gpu::StatePointer(new gpu::State()); 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 // Good to go add the brand new pipeline
_occlusionPipeline = gpu::Pipeline::create(program, state); _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::DeferredFrameTransform, frameTransform->getFrameTransformBuffer());
batch.setUniformBuffer(render_utils::slot::buffer::SsaoParams, _aoParametersBuffer); 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.setPipeline(occlusionPipeline);
batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, occlusionDepthTexture); batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, occlusionDepthTexture);
#if SSAO_USE_QUAD_SPLIT #if SSAO_USE_QUAD_SPLIT
batch.setResourceTexture(render_utils::slot::texture::SsaoNormal, occlusionNormalTexture); 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.x * 2.0f * depthResolutionScale) / (occlusionDepthSize.x * resolutionScale),
(splitSize.y * 2.0f * depthResolutionScale) / (occlusionDepthSize.y * resolutionScale), (splitSize.y * 2.0f * depthResolutionScale) / (occlusionDepthSize.y * resolutionScale),
1.0f); 1.0f);
@ -604,7 +602,7 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte
batch.setViewportTransform(splitViewport); batch.setViewportTransform(splitViewport);
model.setScale(scale); model.setScale(uvScale);
model.setTranslation(glm::vec3(-pixelOffset.x, -pixelOffset.y, 0.0f)); model.setTranslation(glm::vec3(-pixelOffset.x, -pixelOffset.y, 0.0f));
batch.setModelTransform(model); batch.setModelTransform(model);
batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(0)); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(0));
@ -612,27 +610,34 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
model.setTranslation(glm::vec3(pixelOffset.x, -pixelOffset.y, 0.0f)); model.setTranslation(glm::vec3(pixelOffset.x, -pixelOffset.y, 0.0f));
batch.setModelTransform(model);
batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(1)); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(1));
batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[1]); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[1]);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
model.setTranslation(glm::vec3(pixelOffset.x, pixelOffset.y, 0.0f)); model.setTranslation(glm::vec3(pixelOffset.x, pixelOffset.y, 0.0f));
batch.setModelTransform(model);
batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(3)); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(3));
batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[2]); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[2]);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
model.setTranslation(glm::vec3(-pixelOffset.x, pixelOffset.y, 0.0f)); model.setTranslation(glm::vec3(-pixelOffset.x, pixelOffset.y, 0.0f));
batch.setModelTransform(model);
batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(2)); batch.setFramebuffer(_framebuffer->getOcclusionSplitFramebuffer(2));
batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[3]); batch.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[3]);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
} }
#else #else
const auto scale = glm::vec3(
occlusionViewport.z / (framebufferSize.x * resolutionScale),
occlusionViewport.w / (framebufferSize.y * resolutionScale),
1.0f);
model.setScale(scale);
batch.setViewportTransform(occlusionViewport); 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.setUniformBuffer(render_utils::slot::buffer::SsaoFrameParams, _aoFrameParametersBuffer[0]);
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
#endif #endif
@ -655,34 +660,35 @@ void AmbientOcclusionEffect::run(const render::RenderContextPointer& renderConte
PROFILE_RANGE_BATCH(batch, "Bilateral Blur"); PROFILE_RANGE_BATCH(batch, "Bilateral Blur");
// Blur 1st pass // Blur 1st pass
batch.pushProfileRange("Horizontal"); batch.pushProfileRange("Horizontal");
model.setScale(resolutionScale); model.setScale(resolutionScale);
batch.setModelTransform(model); batch.setModelTransform(model);
batch.setViewportTransform(firstBlurViewport); batch.setViewportTransform(firstBlurViewport);
batch.setFramebuffer(occlusionBlurredFBO); batch.setFramebuffer(occlusionBlurredFBO);
// Use full resolution depth and normal for bilateral upscaling and blur // Use full resolution depth and normal for bilateral upscaling and blur
batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, linearDepthTexture); batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, linearDepthTexture);
batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _hblurParametersBuffer); batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _hblurParametersBuffer);
batch.setPipeline(firstHBlurPipeline); batch.setPipeline(firstHBlurPipeline);
batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionFBO->getRenderBuffer(0)); batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionFBO->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
batch.popProfileRange(); batch.popProfileRange();
// Blur 2nd pass // Blur 2nd pass
batch.pushProfileRange("Vertical"); batch.pushProfileRange("Vertical");
model.setScale(glm::vec3(1.0f, resolutionScale, 1.0f)); model.setScale(glm::vec3(1.0f, resolutionScale, 1.0f));
batch.setModelTransform(model); batch.setModelTransform(model);
batch.setViewportTransform(sourceViewport); batch.setViewportTransform(sourceViewport);
batch.setFramebuffer(occlusionFBO); batch.setFramebuffer(occlusionFBO);
batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _vblurParametersBuffer); batch.setUniformBuffer(render_utils::slot::buffer::SsaoBlurParams, _vblurParametersBuffer);
batch.setPipeline(lastVBlurPipeline); batch.setPipeline(lastVBlurPipeline);
batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionBlurredFBO->getRenderBuffer(0)); batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, occlusionBlurredFBO->getRenderBuffer(0));
batch.draw(gpu::TRIANGLE_STRIP, 4); batch.draw(gpu::TRIANGLE_STRIP, 4);
batch.popProfileRange(); batch.popProfileRange();
} }
batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, nullptr); batch.setResourceTexture(render_utils::slot::texture::SsaoDepth, nullptr);
batch.setResourceTexture(render_utils::slot::texture::SsaoNormal, nullptr);
batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, nullptr); batch.setResourceTexture(render_utils::slot::texture::SsaoOcclusion, nullptr);
_gpuTimer->end(batch); _gpuTimer->end(batch);
}); });

View file

@ -275,7 +275,7 @@ vec2 fetchTap(ivec4 side, vec2 tapUV, float tapRadius) {
vec3 buildPosition(ivec4 side, vec2 fragUVPos) { vec3 buildPosition(ivec4 side, vec2 fragUVPos) {
vec2 fetchUV = clamp(fragUVPos, vec2(0), vec2(1)); 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); float Zeye = getZEyeAtUV(fetchUV, 0);
return evalEyePositionFromZeye(side.x, Zeye, fragUVPos); 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 #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); vec2 absSearchVec = abs(searchVec);
int stepCount = int(ceil(searchRadius)); int stepCount = int(ceil(max(pixelSearchVec.x, pixelSearchVec.y)));
float cosHorizonAngle = 0.0; float cosHorizonAngle = 0.0;
if (stepCount>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, float evalVisibilityHBAO(ivec4 side, vec2 fragUVPos, vec2 invSideImageSize, vec2 deltaTap, float diskPixelRadius,
vec3 fragPositionES, vec3 fragNormalES) { vec3 fragPositionES, vec3 fragNormalES) {
vec2 searchVec = (deltaTap * diskPixelRadius) * invSideImageSize; vec2 pixelSearchVec = deltaTap * diskPixelRadius;
vec2 searchVec = pixelSearchVec * invSideImageSize;
float obscurance = 0.0; float obscurance = 0.0;
// Forward search for h1 // 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 // Backward search for h2
obscurance += computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, -searchVec, diskPixelRadius); obscurance += computeHorizon(side, fragUVPos, fragPositionES, fragNormalES, -searchVec, pixelSearchVec, diskPixelRadius);
return obscurance; return obscurance;
} }

View file

@ -43,7 +43,7 @@ void main(void) {
fragUVPos.x = mix(fragUVPos.x, fragUVPos.x * 2.0 - getStereoSide(side), isStereo()); fragUVPos.x = mix(fragUVPos.x, fragUVPos.x * 2.0 - getStereoSide(side), isStereo());
// The position and normal of the pixel fragment in Eye space // 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); vec3 fragPositionES = buildPosition(side, fragUVPos);
#if !SSAO_USE_QUAD_SPLIT #if !SSAO_USE_QUAD_SPLIT
vec3 fragNormalES = buildNormal(side, fragUVPos, fragPositionES, deltaDepthUV); vec3 fragNormalES = buildNormal(side, fragUVPos, fragPositionES, deltaDepthUV);