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
1818 _frameTransformBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(FrameTransform), (const gpu::Byte*) &frameTransform));
1919 }
2020
21−void DeferredFrameTransform::update(RenderArgs* args) {
21+void DeferredFrameTransform::update(RenderArgs* args, glm::vec2 jitter) {
2222
2323 // Update the depth info with near and far (same for stereo)
2424 auto nearZ = args->getViewFrustum().getNearClip();
@@ -38,46 +38,53 @@ void DeferredFrameTransform::update(RenderArgs* args) { · 13 unmodified lines
3838
3939 args->getViewFrustum().evalProjectionMatrix(frameTransformBuffer.projectionMono);
4040
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+
4146 // Running in stereo ?
4247 bool isStereo = args->isStereo();
4348 if (!isStereo) {
44− frameTransformBuffer.projection[0] = frameTransformBuffer.projectionMono;
49+ frameTransformBuffer.projectionUnjittered[0] = frameTransformBuffer.projectionMono;
50+ frameTransformBuffer.invProjectionUnjittered[0] = glm::inverse(frameTransformBuffer.projectionUnjittered[0]);
51+
4552 frameTransformBuffer.stereoInfo = glm::vec4(0.0f, (float)args->_viewport.z, 0.0f, 0.0f);
4653 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]);
4854
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 {
5460
5561 mat4 projMats[2];
5662 mat4 eyeViews[2];
5763 args->_context->getStereoProjections(projMats);
5864 args->_context->getStereoViews(eyeViews);
5965
66+ jitter.x *= 2.0f;
67+
6068 for (int i = 0; i < 2; i++) {
6169 // Compose the mono Eye space to Stereo clip space Projection Matrix
6270 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);
6573
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]);
7078 }
7179
7280 frameTransformBuffer.stereoInfo = glm::vec4(1.0f, (float)(args->_viewport.z >> 1), 0.0f, 1.0f);
7381 frameTransformBuffer.invpixelInfo = glm::vec4(1.0f / (float)(args->_viewport.z >> 1), 1.0f / args->_viewport.w, 0.0f, 0.0f);
74−
7582 }
7683 }
7784
78−void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, DeferredFrameTransformPointer& frameTransform) {
85+void GenerateDeferredFrameTransform::run(const render::RenderContextPointer& renderContext, const Input& jitter, Output& frameTransform) {
7986 if (!frameTransform) {
8087 frameTransform = std::make_shared<DeferredFrameTransform>();
8188 }
82− frameTransform->update(renderContext->args);
89+ frameTransform->update(renderContext->args, jitter);
8390 }