diff --git a/libraries/render-utils/src/deferred_light.slv b/libraries/render-utils/src/deferred_light.slv index 79e8130910..27845bf6a2 100644 --- a/libraries/render-utils/src/deferred_light.slv +++ b/libraries/render-utils/src/deferred_light.slv @@ -28,8 +28,8 @@ void main(void) { _texCoord0 = (pos.xy + 1) * 0.5; - _texCoord0 += texcoordFrameTransform.xy; _texCoord0 *= texcoordFrameTransform.zw; + _texCoord0 += texcoordFrameTransform.xy; gl_Position = pos; } diff --git a/libraries/render-utils/src/point_light.slf b/libraries/render-utils/src/point_light.slf index 150460dc9f..80b2e62b8a 100644 --- a/libraries/render-utils/src/point_light.slf +++ b/libraries/render-utils/src/point_light.slf @@ -36,8 +36,8 @@ void main(void) { // Grab the fragment data from the uv vec2 texCoord = _texCoord0.st / _texCoord0.q; - texCoord += texcoordFrameTransform.xy; texCoord *= texcoordFrameTransform.zw; + texCoord += texcoordFrameTransform.xy; DeferredFragment frag = unpackDeferredFragment(deferredTransform, texCoord); diff --git a/libraries/render-utils/src/spot_light.slf b/libraries/render-utils/src/spot_light.slf index 0502fc2753..4d4ad71413 100644 --- a/libraries/render-utils/src/spot_light.slf +++ b/libraries/render-utils/src/spot_light.slf @@ -36,8 +36,8 @@ void main(void) { // Grab the fragment data from the uv vec2 texCoord = _texCoord0.st / _texCoord0.q; - texCoord += texcoordFrameTransform.xy; texCoord *= texcoordFrameTransform.zw; + texCoord += texcoordFrameTransform.xy; DeferredFragment frag = unpackDeferredFragment(deferredTransform, texCoord); diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index 19c45e6663..041d69370a 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -49,6 +49,13 @@ void BlurParams::setWidthHeight(int width, int height, bool isStereo) { } } +void BlurParams::setTexcoordTransform(const glm::vec4 texcoordTransformViewport) { + auto texcoordTransform = _parametersBuffer.get().texcoordTransform; + if (texcoordTransformViewport != texcoordTransform) { + _parametersBuffer.edit().texcoordTransform = texcoordTransform; + } +} + void BlurParams::setFilterRadiusScale(float scale) { auto filterInfo = _parametersBuffer.get().filterInfo; if (scale != filterInfo.x) { @@ -211,6 +218,8 @@ void BlurGaussian::run(const SceneContextPointer& sceneContext, const RenderCont auto blurHPipeline = getBlurHPipeline(); _parameters->setWidthHeight(args->_viewport.z, args->_viewport.w, args->_context->isStereo()); + glm::ivec2 textureSize(blurringResources.sourceTexture->getDimensions()); + _parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, args->_viewport)); gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); @@ -320,6 +329,8 @@ void BlurGaussianDepthAware::run(const SceneContextPointer& sceneContext, const auto blurHPipeline = getBlurHPipeline(); _parameters->setWidthHeight(args->_viewport.z, args->_viewport.w, args->_context->isStereo()); + glm::ivec2 textureSize(blurringResources.sourceTexture->getDimensions()); + _parameters->setTexcoordTransform(gpu::Framebuffer::evalSubregionTexcoordTransformCoefficients(textureSize, args->_viewport)); _parameters->setDepthPerspective(args->getViewFrustum().getProjection()[1][1]); gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { diff --git a/libraries/render/src/render/BlurTask.h b/libraries/render/src/render/BlurTask.h index 6a0cd55a95..88228d1d86 100644 --- a/libraries/render/src/render/BlurTask.h +++ b/libraries/render/src/render/BlurTask.h @@ -22,6 +22,8 @@ public: void setWidthHeight(int width, int height, bool isStereo); + void setTexcoordTransform(const glm::vec4 texcoordTransformViewport); + void setFilterRadiusScale(float scale); void setDepthPerspective(float oneOverTan2FOV); @@ -33,6 +35,9 @@ public: // Resolution info (width, height, inverse of width, inverse of height) glm::vec4 resolutionInfo{ 0.0f, 0.0f, 0.0f, 0.0f }; + // Viewport to Texcoord info, if the region of the blur (viewport) is smaller than the full frame + glm::vec4 texcoordTransform{ 0.0f, 0.0f, 1.0f, 1.0f }; + // Filter info (radius scale glm::vec4 filterInfo{ 1.0f, 0.0f, 0.0f, 0.0f }; diff --git a/libraries/render/src/render/BlurTask.slh b/libraries/render/src/render/BlurTask.slh index dd1a229599..c66eaff00b 100644 --- a/libraries/render/src/render/BlurTask.slh +++ b/libraries/render/src/render/BlurTask.slh @@ -23,6 +23,7 @@ const float gaussianDistributionOffset[NUM_TAPS] = float[]( struct BlurParameters { vec4 resolutionInfo; + vec4 texcoordTransform; vec4 filterInfo; vec4 depthInfo; vec4 stereoInfo; @@ -36,6 +37,10 @@ vec2 getViewportInvWidthHeight() { return parameters.resolutionInfo.zw; } +vec2 evalTexcoordTransformed(vec2 texcoord) { + return (texcoord * parameters.texcoordTransform.zw + parameters.texcoordTransform.xy); +} + float getFilterScale() { return parameters.filterInfo.x; } @@ -59,7 +64,7 @@ float getDepthPerspective() { uniform sampler2D sourceMap; vec4 pixelShaderGaussian(vec2 texcoord, vec2 direction, vec2 pixelStep) { - + texcoord = evalTexcoordTransformed(texcoord); vec4 sampleCenter = texture(sourceMap, texcoord); vec2 finalStep = getFilterScale() * direction * pixelStep; @@ -86,7 +91,7 @@ uniform sampler2D sourceMap; uniform sampler2D depthMap; vec4 pixelShaderGaussianDepthAware(vec2 texcoord, vec2 direction, vec2 pixelStep) { - + texcoord = evalTexcoordTransformed(texcoord); float sampleDepth = texture(depthMap, texcoord).x; vec4 sampleCenter = texture(sourceMap, texcoord);