public PreviousFrameData GetMotionDataForCamera(Camera camera, CameraData camData) { // Get MotionData PreviousFrameData motionData; if (!m_CameraFrameData.TryGetValue(camera, out motionData)) { motionData = new PreviousFrameData(); m_CameraFrameData.Add(camera, motionData); } // Calculate motion data CalculateTime(); UpdateMotionData(camera, camData, motionData); return(motionData); }
void UpdateMotionData(Camera camera, CameraData cameraData, PreviousFrameData motionData) { // The actual projection matrix used in shaders is actually massaged a bit to work across all platforms // (different Z value ranges etc.) // A camera could be rendered multiple times per frame, only updates the previous view proj & pos if needed #if ENABLE_VR && ENABLE_XR_MODULE if (cameraData.xr.enabled) { var gpuVP0 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrix(0), true) * cameraData.GetViewMatrix(0); var gpuVP1 = GL.GetGPUProjectionMatrix(cameraData.GetProjectionMatrix(1), true) * cameraData.GetViewMatrix(1); // Last frame data if (motionData.lastFrameActive != Time.frameCount) { bool firstFrame = motionData.isFirstFrame; var prevViewProjStereo = motionData.previousViewProjectionMatrixStereo; prevViewProjStereo[0] = firstFrame ? gpuVP0 : prevViewProjStereo[0]; prevViewProjStereo[1] = firstFrame ? gpuVP1 : prevViewProjStereo[1]; motionData.isFirstFrame = false; } // Current frame data var viewProjStereo = motionData.viewProjectionMatrixStereo; viewProjStereo[0] = gpuVP0; viewProjStereo[1] = gpuVP1; } else #endif { var gpuProj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, true); // Had to change this from 'false' var gpuView = camera.worldToCameraMatrix; var gpuVP = gpuProj * gpuView; // Last frame data if (motionData.lastFrameActive != Time.frameCount) { motionData.previousViewProjectionMatrix = motionData.isFirstFrame ? gpuVP : motionData.viewProjectionMatrix; motionData.isFirstFrame = false; } // Current frame data motionData.viewProjectionMatrix = gpuVP; } motionData.lastFrameActive = Time.frameCount; }
internal void Setup(RTHandle color, RTHandle depth, PreviousFrameData frameData) { m_MotionData = frameData; m_Color = color; m_Depth = depth; }
internal void Setup(PreviousFrameData frameData) { m_MotionData = frameData; }