History

Jitter is now set through a batch command

Olivier Prat committed 8 years ago

Commit c6d598c1 parent 57ff1c517 files · +124 −103Browse files

Showing the changes to libraries/render-utils/src/DeferredFrameTransform.cpp (1 of 17 files). Show all

Unified · Split

libraries/render-utils/src/DeferredFrameTransform.cpp+24−17
@@ -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
21void DeferredFrameTransform::update(RenderArgs* args) {21void 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 Matrix69 // 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
78void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform) {85void 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}