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 | _frameTransformBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(FrameTransform), (const gpu::Byte*) &frameTransform)); | 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 | // Update the depth info with near and far (same for stereo) | 23 | // Update the depth info with near and far (same for stereo) |
| 24 | auto nearZ = args->getViewFrustum().getNearClip(); | 24 | auto nearZ = args->getViewFrustum().getNearClip(); |
| @@ -38,46 +38,53 @@ void DeferredFrameTransform::update(RenderArgs* args) { · 13 unmodified lines | |||
| 38 | 38 | ||
| 39 | args->getViewFrustum().evalProjectionMatrix(frameTransformBuffer.projectionMono); | 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 | // Running in stereo ? | 46 | // Running in stereo ? |
| 42 | bool isStereo = args->isStereo(); | 47 | bool isStereo = args->isStereo(); |
| 43 | if (!isStereo) { | 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 | frameTransformBuffer.stereoInfo = glm::vec4(0.0f, (float)args->_viewport.z, 0.0f, 0.0f); | 52 | frameTransformBuffer.stereoInfo = glm::vec4(0.0f, (float)args->_viewport.z, 0.0f, 0.0f); |
| 46 | frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / args->_viewport.z, 1.0f / args->_viewport.w, 0.0f, 0.0f); | 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]; | 55 | frameTransformBuffer.projection[0] = frameTransformBuffer.projectionUnjittered[0]; |
| 50 | frameTransformBuffer.projectionUnjittered[0][2][0] -= args->_context->getProjectionJitter().x; | 56 | frameTransformBuffer.projection[0][2][0] += jitter.x; |
| 51 | frameTransformBuffer.projectionUnjittered[0][2][1] -= args->_context->getProjectionJitter().y; | 57 | frameTransformBuffer.projection[0][2][1] += jitter.y; |
| 52 | frameTransformBuffer.invProjectionUnjittered[0] = glm::inverse(frameTransformBuffer.projectionUnjittered[0]); | 58 | frameTransformBuffer.invProjection[0] = glm::inverse(frameTransformBuffer.projection[0]); |
| 53 | } else { | 59 | } else { |
| 54 | 60 | ||
| 55 | mat4 projMats[2]; | 61 | mat4 projMats[2]; |
| 56 | mat4 eyeViews[2]; | 62 | mat4 eyeViews[2]; |
| 57 | args->_context->getStereoProjections(projMats); | 63 | args->_context->getStereoProjections(projMats); |
| 58 | args->_context->getStereoViews(eyeViews); | 64 | args->_context->getStereoViews(eyeViews); |
| 59 | 65 | ||
| 66 | jitter.x *= 2.0f; | ||
| 67 | |||
| 60 | for (int i = 0; i < 2; i++) { | 68 | for (int i = 0; i < 2; i++) { |
| 61 | // Compose the mono Eye space to Stereo clip space Projection Matrix | 69 | // Compose the mono Eye space to Stereo clip space Projection Matrix |
| 62 | auto sideViewMat = projMats[i] * eyeViews[i]; | 70 | auto sideViewMat = projMats[i] * eyeViews[i]; |
| 63 | frameTransformBuffer.projection[i] = sideViewMat; | 71 | frameTransformBuffer.projectionUnjittered[i] = sideViewMat; |
| 64 | frameTransformBuffer.invProjection[i] = glm::inverse(sideViewMat); | 72 | frameTransformBuffer.invProjectionUnjittered[i] = glm::inverse(sideViewMat); |
| 65 | 73 | ||
| 66 | frameTransformBuffer.projectionUnjittered[i] = frameTransformBuffer.projection[i]; | 74 | frameTransformBuffer.projection[i] = frameTransformBuffer.projectionUnjittered[i]; |
| 67 | frameTransformBuffer.projectionUnjittered[i][2][0] -= args->_context->getProjectionJitter().x; | 75 | frameTransformBuffer.projection[i][2][0] += jitter.x; |
| 68 | frameTransformBuffer.projectionUnjittered[i][2][1] -= args->_context->getProjectionJitter().y; | 76 | frameTransformBuffer.projection[i][2][1] += jitter.y; |
| 69 | frameTransformBuffer.invProjectionUnjittered[i] = glm::inverse(frameTransformBuffer.projectionUnjittered[i]); | 77 | frameTransformBuffer.invProjection[i] = glm::inverse(frameTransformBuffer.projection[i]); |
| 70 | } | 78 | } |
| 71 | 79 | ||
| 72 | frameTransformBuffer.stereoInfo = glm::vec4(1.0f, (float)(args->_viewport.z >> 1), 0.0f, 1.0f); | 80 | frameTransformBuffer.stereoInfo = glm::vec4(1.0f, (float)(args->_viewport.z >> 1), 0.0f, 1.0f); |
| 73 | frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / (float)(args->_viewport.z >> 1), 1.0f / args->_viewport.w, 0.0f, 0.0f); | 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 | if (!frameTransform) { | 86 | if (!frameTransform) { |
| 80 | frameTransform = std::make_shared<DeferredFrameTransform>(); | 87 | frameTransform = std::make_shared<DeferredFrameTransform>(); |
| 81 | } | 88 | } |
| 82 | frameTransform->update(renderContext->args); | 89 | frameTransform->update(renderContext->args, jitter); |
| 83 | } | 90 | } |