mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 06:18:52 +02:00
Concentrating on resolution level 1
This commit is contained in:
parent
60f5913002
commit
9899eb6d3f
3 changed files with 48 additions and 41 deletions
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue