// TODO: We'll probably need to isolate most of this for SRPs
        public void ConfigureStereoJitteredProjectionMatrices(PostProcessRenderContext context)
        {
#if  UNITY_2017_3_OR_NEWER
            var camera = context.camera;
            jitter  = GenerateRandomOffset();
            jitter *= jitterSpread;

            for (var eye = Camera.StereoscopicEye.Left; eye <= Camera.StereoscopicEye.Right; eye++)
            {
                // This saves off the device generated projection matrices as non-jittered
                context.camera.CopyStereoDeviceProjectionMatrixToNonJittered(eye);
                var originalProj = context.camera.GetStereoNonJitteredProjectionMatrix(eye);

                // Currently no support for custom jitter func, as VR devices would need to provide
                // original projection matrix as input along with jitter
                var jitteredMatrix = RuntimeUtilities.GenerateJitteredProjectionMatrixFromOriginal(context, originalProj, jitter);
                context.camera.SetStereoProjectionMatrix(eye, jitteredMatrix);
            }

            // jitter has to be scaled for the actual eye texture size, not just the intermediate texture size
            // which could be double-wide in certain stereo rendering scenarios
            jitter = new Vector2(jitter.x / context.xrSingleEyeWidth, jitter.y / context.height);
            camera.useJitteredProjectionMatrixForTransparentRendering = false;
#endif
        }
Пример #2
0
        // Must be called after GetJitteredProjectionMatrix() to work correctly.
        public Matrix4x4 GetStereoJitteredProjectionMatrix(int screenWidth, int screenHeight, Camera camera, Camera.StereoscopicEye eye)
        {
            Matrix4x4 cameraProj;

#if  UNITY_2017_3_OR_NEWER
            jitter  = GetRandomOffset();
            jitter *= jitterSpread;
            Matrix4x4 originalProj = camera.GetStereoProjectionMatrix(eye);
            // Currently no support for custom jitter func, as VR devices would need to provide
            // original projection matrix as input along with jitter
            cameraProj = RuntimeUtilities.GenerateJitteredProjectionMatrixFromOriginal(screenWidth, screenHeight, originalProj, jitter);

            // jitter has to be scaled for the actual eye texture size, not just the intermediate texture size
            // which could be double-wide in certain stereo rendering scenarios
            jitter = new Vector2(jitter.x / screenWidth, jitter.y / screenHeight);
#endif
            return(cameraProj);
        }
Пример #3
0
        public void ConfigureStereoJitteredProjectionMatrices(PostProcessRenderContext context)
        {
            Camera camera = context.camera;

            this.jitter  = GenerateRandomOffset();
            this.jitter *= jitterSpread;
            for (Camera.StereoscopicEye stereoscopicEye = Camera.StereoscopicEye.Left; stereoscopicEye <= Camera.StereoscopicEye.Right; stereoscopicEye++)
            {
                context.camera.CopyStereoDeviceProjectionMatrixToNonJittered(stereoscopicEye);
                Matrix4x4 stereoNonJitteredProjectionMatrix = context.camera.GetStereoNonJitteredProjectionMatrix(stereoscopicEye);
                Matrix4x4 matrix = RuntimeUtilities.GenerateJitteredProjectionMatrixFromOriginal(context, stereoNonJitteredProjectionMatrix, this.jitter);
                context.camera.SetStereoProjectionMatrix(stereoscopicEye, matrix);
            }
            Vector2 jitter  = this.jitter;
            float   x       = jitter.x / (float)context.screenWidth;
            Vector2 jitter2 = this.jitter;

            this.jitter = new Vector2(x, jitter2.y / (float)context.screenHeight);
            camera.useJitteredProjectionMatrixForTransparentRendering = false;
        }