Showing the changes to libraries/render-utils/src/DeferredFrameTransform.cpp (1 of 17 files). Show all
Unified · Split
| @@ -18,7 +18,7 @@ DeferredFrameTransform::DeferredFrameTransform() { · 17 unmodified lines | ||
| 18 | 18 | _frameTransformBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(FrameTransform), (const gpu::Byte*) &frameTransform)); |
| 19 | 19 | } |
| 20 | 20 | |
| 21 | −void DeferredFrameTransform::update(RenderArgs* args) { | |
| 21 | +void DeferredFrameTransform::update(RenderArgs* args, glm::vec2 jitter) { | |
| 22 | 22 | |
| 23 | 23 | // Update the depth info with near and far (same for stereo) |
| 24 | 24 | auto nearZ = args->getViewFrustum().getNearClip(); |
| @@ -38,46 +38,53 @@ void DeferredFrameTransform::update(RenderArgs* args) { · 13 unmodified lines | ||
| 38 | 38 | |
| 39 | 39 | args->getViewFrustum().evalProjectionMatrix(frameTransformBuffer.projectionMono); |
| 40 | 40 | |
| 41 | + // There may be some sort of mismatch here if the viewport size isn't the same as the frame buffer size as | |
| 42 | + // jitter is normalized by frame buffer size in TransformCamera. But we should be safe. | |
| 43 | + jitter.x /= args->_viewport.z; | |
| 44 | + jitter.y /= args->_viewport.w; | |
| 45 | + | |
| 41 | 46 | // Running in stereo ? |
| 42 | 47 | bool isStereo = args->isStereo(); |
| 43 | 48 | if (!isStereo) { |
| 44 | − frameTransformBuffer.projection[0] = frameTransformBuffer.projectionMono; | |
| 49 | + frameTransformBuffer.projectionUnjittered[0] = frameTransformBuffer.projectionMono; | |
| 50 | + frameTransformBuffer.invProjectionUnjittered[0] = glm::inverse(frameTransformBuffer.projectionUnjittered[0]); | |
| 51 | + | |
| 45 | 52 | frameTransformBuffer.stereoInfo = glm::vec4(0.0f, (float)args->_viewport.z, 0.0f, 0.0f); |
| 46 | 53 | frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / args->_viewport.z, 1.0f / args->_viewport.w, 0.0f, 0.0f); |
| 47 | − frameTransformBuffer.invProjection[0] = glm::inverse(frameTransformBuffer.projection[0]); | |
| 48 | 54 | |
| 49 | − frameTransformBuffer.projectionUnjittered[0] = frameTransformBuffer.projection[0]; | |
| 50 | − frameTransformBuffer.projectionUnjittered[0][2][0] -= args->_context->getProjectionJitter().x; | |
| 51 | − frameTransformBuffer.projectionUnjittered[0][2][1] -= args->_context->getProjectionJitter().y; | |
| 52 | − frameTransformBuffer.invProjectionUnjittered[0] = glm::inverse(frameTransformBuffer.projectionUnjittered[0]); | |
| 53 | − } else { | |
| 55 | + frameTransformBuffer.projection[0] = frameTransformBuffer.projectionUnjittered[0]; | |
| 56 | + frameTransformBuffer.projection[0][2][0] += jitter.x; | |
| 57 | + frameTransformBuffer.projection[0][2][1] += jitter.y; | |
| 58 | + frameTransformBuffer.invProjection[0] = glm::inverse(frameTransformBuffer.projection[0]); | |
| 59 | + } else { | |
| 54 | 60 | |
| 55 | 61 | mat4 projMats[2]; |
| 56 | 62 | mat4 eyeViews[2]; |
| 57 | 63 | args->_context->getStereoProjections(projMats); |
| 58 | 64 | args->_context->getStereoViews(eyeViews); |
| 59 | 65 | |
| 66 | + jitter.x *= 2.0f; | |
| 67 | + | |
| 60 | 68 | for (int i = 0; i < 2; i++) { |
| 61 | 69 | // Compose the mono Eye space to Stereo clip space Projection Matrix |
| 62 | 70 | auto sideViewMat = projMats[i] * eyeViews[i]; |
| 63 | − frameTransformBuffer.projection[i] = sideViewMat; | |
| 64 | − frameTransformBuffer.invProjection[i] = glm::inverse(sideViewMat); | |
| 71 | + frameTransformBuffer.projectionUnjittered[i] = sideViewMat; | |
| 72 | + frameTransformBuffer.invProjectionUnjittered[i] = glm::inverse(sideViewMat); | |
| 65 | 73 | |
| 66 | − frameTransformBuffer.projectionUnjittered[i] = frameTransformBuffer.projection[i]; | |
| 67 | − frameTransformBuffer.projectionUnjittered[i][2][0] -= args->_context->getProjectionJitter().x; | |
| 68 | − frameTransformBuffer.projectionUnjittered[i][2][1] -= args->_context->getProjectionJitter().y; | |
| 69 | − frameTransformBuffer.invProjectionUnjittered[i] = glm::inverse(frameTransformBuffer.projectionUnjittered[i]); | |
| 74 | + frameTransformBuffer.projection[i] = frameTransformBuffer.projectionUnjittered[i]; | |
| 75 | + frameTransformBuffer.projection[i][2][0] += jitter.x; | |
| 76 | + frameTransformBuffer.projection[i][2][1] += jitter.y; | |
| 77 | + frameTransformBuffer.invProjection[i] = glm::inverse(frameTransformBuffer.projection[i]); | |
| 70 | 78 | } |
| 71 | 79 | |
| 72 | 80 | frameTransformBuffer.stereoInfo = glm::vec4(1.0f, (float)(args->_viewport.z >> 1), 0.0f, 1.0f); |
| 73 | 81 | frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / (float)(args->_viewport.z >> 1), 1.0f / args->_viewport.w, 0.0f, 0.0f); |
| 74 | − | |
| 75 | 82 | } |
| 76 | 83 | } |
| 77 | 84 | |
| 78 | −void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform) { | |
| 85 | +void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, const Input& jitter, Output& frameTransform) { | |
| 79 | 86 | if (!frameTransform) { |
| 80 | 87 | frameTransform = std::make_shared<DeferredFrameTransform>(); |
| 81 | 88 | } |
| 82 | − frameTransform->update(renderContext->args); | |
| 89 | + frameTransform->update(renderContext->args, jitter); | |
| 83 | 90 | } |