diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag index 783c0f67da..6e9ed82d95 100644 --- a/interface/resources/shaders/ambient_occlusion.frag +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -30,6 +30,12 @@ uniform vec2 leftBottom; // the right and top edges of the view window uniform vec2 rightTop; +// an offset value to apply to the texture coordinates +uniform vec2 texCoordOffset; + +// a scale value to apply to the texture coordinates +uniform vec2 texCoordScale; + // the radius of the effect uniform float radius; @@ -38,7 +44,7 @@ uniform vec2 noiseScale; // given a texture coordinate, returns the 3D view space z coordinate float texCoordToViewSpaceZ(vec2 texCoord) { - return (far * near) / (texture2D(depthTexture, texCoord).r * (far - near) - far); + return (far * near) / (texture2D(depthTexture, texCoord * texCoordScale + texCoordOffset).r * (far - near) - far); } // given a texture coordinate, returns the 3D view space coordinate diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 907ec7a863..d6848453ec 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -57,6 +57,8 @@ void AmbientOcclusionEffect::init() { _leftBottomLocation = _occlusionProgram->uniformLocation("leftBottom"); _rightTopLocation = _occlusionProgram->uniformLocation("rightTop"); _noiseScaleLocation = _occlusionProgram->uniformLocation("noiseScale"); + _texCoordOffsetLocation = _occlusionProgram->uniformLocation("texCoordOffset"); + _texCoordScaleLocation = _occlusionProgram->uniformLocation("texCoordScale"); // generate the random rotation texture glGenTextures(1, &_rotationTextureID); @@ -106,22 +108,25 @@ void AmbientOcclusionEffect::render() { Application::getInstance()->computeOffAxisFrustum( left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + int viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + const int VIEWPORT_X_INDEX = 0; + const int VIEWPORT_WIDTH_INDEX = 2; + QSize widgetSize = Application::getInstance()->getGLWidget()->size(); + float sMin = viewport[VIEWPORT_X_INDEX] / (float)widgetSize.width(); + float sWidth = viewport[VIEWPORT_WIDTH_INDEX] / (float)widgetSize.width(); + _occlusionProgram->bind(); _occlusionProgram->setUniformValue(_nearLocation, nearVal); _occlusionProgram->setUniformValue(_farLocation, farVal); _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); _occlusionProgram->setUniformValue(_rightTopLocation, right, top); - QSize widgetSize = Application::getInstance()->getGLWidget()->size(); - _occlusionProgram->setUniformValue(_noiseScaleLocation, widgetSize.width() / (float)ROTATION_WIDTH, + _occlusionProgram->setUniformValue(_noiseScaleLocation, viewport[VIEWPORT_WIDTH_INDEX] / (float)ROTATION_WIDTH, widgetSize.height() / (float)ROTATION_HEIGHT); + _occlusionProgram->setUniformValue(_texCoordOffsetLocation, sMin, 0.0f); + _occlusionProgram->setUniformValue(_texCoordScaleLocation, sWidth, 1.0f); - int viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - const int VIEWPORT_X_INDEX = 0; - const int VIEWPORT_WIDTH_INDEX = 2; - float sMin = viewport[VIEWPORT_X_INDEX] / (float)widgetSize.width(); - float sMax = (viewport[VIEWPORT_X_INDEX] + viewport[VIEWPORT_WIDTH_INDEX]) / (float)widgetSize.width(); - renderFullscreenQuad(sMin, sMax); + renderFullscreenQuad(); _occlusionProgram->release(); @@ -141,7 +146,7 @@ void AmbientOcclusionEffect::render() { _blurProgram->bind(); _blurProgram->setUniformValue(_blurScaleLocation, 1.0f / widgetSize.width(), 1.0f / widgetSize.height()); - renderFullscreenQuad(sMin, sMax); + renderFullscreenQuad(sMin, sMin + sWidth); _blurProgram->release(); diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index 416d97c236..dba9a97202 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -30,6 +30,8 @@ private: int _leftBottomLocation; int _rightTopLocation; int _noiseScaleLocation; + int _texCoordOffsetLocation; + int _texCoordScaleLocation; ProgramObject* _blurProgram; int _blurScaleLocation;