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); } }
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 } }