void Start()
        {
            if (_computeShader != null)
            {
                _clearMat       = new Material(Shader.Find("Unlit/Color"));
                _clearMat.color = Color.black;

                // kernel
                _kernel = _computeShader.FindKernel("CSMain");

                // constant buffer
                _width        = ViveSR_DualCameraImageCapture.DepthImageWidth;
                _height       = ViveSR_DualCameraImageCapture.DepthImageHeight;
                _depthParam.x = (float)ViveSR_DualCameraImageCapture.FocalLength_L;
                _depthParam.y = (float)ViveSR_DualCameraImageCapture.Baseline;
                _depthParam.z = ViveSR_DualCameraImageRenderer.OcclusionNearDistance;
                _depthParam.w = ViveSR_DualCameraImageRenderer.OcclusionFarDistance;

                // input texture
                int       frameIndex, timeIndex;
                Texture2D textureDepth;
                Matrix4x4 Pose_L;
                ViveSR_DualCameraImageCapture.GetDepthTexture(out textureDepth, out frameIndex, out timeIndex, out Pose_L);

                // result texture
                _warpDepth = new RenderTexture(_width, _height, 0, RenderTextureFormat.RFloat);
                _warpDepth.enableRandomWrite = true;
                _warpDepth.Create();

                // bind
                _computeShader.SetInt("ImageWidth", _width);
                _computeShader.SetVector("DepthParam", _depthParam);
                _computeShader.SetTexture(_kernel, "DepthInput", textureDepth);
                _computeShader.SetTexture(_kernel, "Result", _warpDepth);
            }
        }
Esempio n. 2
0
        private void Update()
        {
            if (ViveSR_DualCameraRig.DualCameraStatus == DualCameraStatus.WORKING)
            {
                if (!CallbackMode)
                {
                    if (UpdateDistortedMaterial)
                    {
                        // native buffer ptr method 1:
                        // get native buffer ptr & let native(cpp) do texture upload
                        //StartCoroutine(UpdateGPUFishEyeTexture());
                        ViveSR_DualCameraImageCapture.UpdateDistortedImage();
                    }
                    if (UpdateUndistortedMaterial)
                    {
                        /*
                         * if(ViveSR_DualCameraImageCapture.UndistortTextureIsNative)
                         *  StartCoroutine(UpdateGPUUndistortTexture());
                         */
                        ViveSR_DualCameraImageCapture.UpdateUndistortedImage();
                    }
                    if (UpdateDepthMaterial)
                    {
                        ViveSR_DualCameraImageCapture.UpdateDepthImage();
                    }
                }

                #region Distorted Image
                if (_UpdateDistortedMaterial)
                {
                    int currentCameraTimeIndex = ViveSR_DualCameraImageCapture.DistortedTimeIndex;
                    if (currentCameraTimeIndex != LastDistortedTextureUpdateTime)
                    {
                        DistortedTimer.Add(currentCameraTimeIndex - LastDistortedTextureUpdateTime);
                        RealDistortedFPS = 1000 / DistortedTimer.AverageLeast(100);
                        int       frameIndex, timeIndex;
                        Texture2D textureCameraLeft, textureCameraRight;
                        ViveSR_DualCameraImageCapture.GetDistortedTexture(out textureCameraLeft, out textureCameraRight, out frameIndex, out timeIndex, out PoseDistorted[(int)DualCameraIndex.LEFT], out PoseDistorted[(int)DualCameraIndex.RIGHT]);
                        for (int i = 0; i < DistortedLeft.Count; i++)
                        {
                            if (DistortedLeft[i] != null)
                            {
                                DistortedLeft[i].mainTexture = textureCameraLeft;
                                if (ViveSR_DualCameraImageCapture.DistortTextureIsNative)
                                {
                                    DistortedLeft[i].mainTextureScale  = new Vector2(1, 0.5f);
                                    DistortedLeft[i].mainTextureOffset = new Vector2(0, 0.5f);
                                }
                            }
                        }
                        for (int i = 0; i < DistortedRight.Count; i++)
                        {
                            if (DistortedRight[i] != null)
                            {
                                DistortedRight[i].mainTexture = textureCameraRight;
                                if (ViveSR_DualCameraImageCapture.DistortTextureIsNative)
                                {
                                    DistortedRight[i].mainTextureScale = new Vector2(1, 0.5f);
                                }
                            }
                        }
                        LastDistortedTextureUpdateTime = currentCameraTimeIndex;

                        //change pose update flow to camera preRender
                        if (EnablePreRender == false)
                        {
                            ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition  = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.LEFT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation  = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.LEFT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseDistorted[(int)DualCameraIndex.RIGHT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseDistorted[(int)DualCameraIndex.RIGHT]);
                        }
                    }
                }
                #endregion

                #region Undistorted Image
                if (_UpdateUndistortedMaterial)
                {
                    int currentUndistortedTimeIndex = ViveSR_DualCameraImageCapture.UndistortedTimeIndex;
                    if (currentUndistortedTimeIndex != LastUndistortedTextureUpdateTime)
                    {
                        UndistortedTimer.Add(currentUndistortedTimeIndex - LastUndistortedTextureUpdateTime);
                        RealUndistortedFPS = 1000 / UndistortedTimer.AverageLeast(100);
                        int FrameIndexUndistorted, TimeIndexUndistorted;
                        ViveSR_DualCameraImageCapture.GetUndistortedTexture(out TextureUndistorted[(int)DualCameraIndex.LEFT], out TextureUndistorted[(int)DualCameraIndex.RIGHT], out FrameIndexUndistorted, out TimeIndexUndistorted,
                                                                            out PoseUndistorted[(int)DualCameraIndex.LEFT], out PoseUndistorted[(int)DualCameraIndex.RIGHT]);

                        for (int i = 0; i < UndistortedLeft.Count; i++)
                        {
                            if (UndistortedLeft[i] != null)
                            {
                                UndistortedLeft[i].mainTexture = TextureUndistorted[(int)DualCameraIndex.LEFT];
                                // restore the tiling / offset which may be modified
                                if (ViveSR_DualCameraImageCapture.DistortTextureIsNative)
                                {
                                    UndistortedLeft[i].mainTextureScale  = Vector2.one;
                                    UndistortedLeft[i].mainTextureOffset = Vector2.zero;
                                }
                            }
                        }
                        for (int i = 0; i < UndistortedRight.Count; i++)
                        {
                            if (UndistortedRight[i] != null)
                            {
                                UndistortedRight[i].mainTexture = TextureUndistorted[(int)DualCameraIndex.RIGHT];
                                // restore the tiling / offset which may be modified
                                if (ViveSR_DualCameraImageCapture.DistortTextureIsNative)
                                {
                                    UndistortedRight[i].mainTextureScale = Vector2.one;
                                }
                            }
                        }
                        LastUndistortedTextureUpdateTime = currentUndistortedTimeIndex;

                        if (_UndistortMethod == UndistortionMethod.DEFISH_BY_SRMODULE && EnablePreRender == false)
                        {
                            ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localPosition  = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.LEFT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraLeft.transform.localRotation  = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.LEFT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localPosition = ViveSR_DualCameraImageCapture.Position(PoseUndistorted[(int)DualCameraIndex.RIGHT]);
                            ViveSR_DualCameraRig.Instance.TrackedCameraRight.transform.localRotation = ViveSR_DualCameraImageCapture.Rotation(PoseUndistorted[(int)DualCameraIndex.RIGHT]);
                        }
                    }
                }
                #endregion

                #region Depth Image
                if (_UpdateDepthMaterial)
                {
                    int currentDepthTimeIndex = ViveSR_DualCameraImageCapture.DepthTimeIndex;
                    if (currentDepthTimeIndex != LastDepthTextureUpdateTime)
                    {
                        DepthTimer.Add(currentDepthTimeIndex - LastDepthTextureUpdateTime);
                        RealDepthFPS = 1000 / DepthTimer.AverageLeast(100);
                        int       frameIndex, timeIndex;
                        Texture2D textureDepth;
                        Matrix4x4 PoseDepth;
                        ViveSR_DualCameraImageCapture.GetDepthTexture(out textureDepth, out frameIndex, out timeIndex, out PoseDepth);
                        for (int i = 0; i < Depth.Count; i++)
                        {
                            if (Depth[i] != null)
                            {
                                Depth[i].mainTexture = textureDepth;
                            }
                        }
                        LastDepthTextureUpdateTime = currentDepthTimeIndex;
                    }
                }
                #endregion
            }
        }