/// <summary> /// Texture settings for stereo video capture. /// </summary> protected void CreateStereoTextures() { if (captureSource == CaptureSource.CAMERA && stereoMode != StereoMode.NONE) { // Stereo camera settings. regularCamera.transform.Translate(new Vector3(-interpupillaryDistance / 2, 0, 0), Space.Self); stereoCamera.transform.Translate(new Vector3(interpupillaryDistance / 2, 0, 0), Space.Self); // Init stereo video material. stereoPackMaterial = Utils.CreateMaterial("VideoCapture/StereoPack", stereoPackMaterial); stereoPackMaterial.DisableKeyword("STEREOPACK_TOP"); stereoPackMaterial.DisableKeyword("STEREOPACK_BOTTOM"); stereoPackMaterial.DisableKeyword("STEREOPACK_LEFT"); stereoPackMaterial.DisableKeyword("STEREOPACK_RIGHT"); // Init the temporary stereo target texture. stereoTexture = Utils.CreateRenderTexture(outputFrameWidth, outputFrameHeight, 24, antiAliasingSetting, stereoTexture); // Set stereo camera //if (captureMode == CaptureMode.REGULAR) // stereoCamera.targetTexture = stereoTexture; //else // stereoCamera.targetTexture = null; stereoCamera.targetTexture = stereoTexture; // Init the final stereo texture. stereoOutputTexture = Utils.CreateRenderTexture(outputFrameWidth, outputFrameHeight, 24, antiAliasingSetting, stereoOutputTexture); } }
/// <summary> /// Create the RenderTexture for encoding texture /// </summary> protected void CreateRenderTextures() { outputFrameWidth = frameWidth; outputFrameHeight = frameHeight; if (outputTexture != null && (outputFrameWidth != outputTexture.width || outputFrameHeight != outputTexture.height)) { ClearRenderTextures(); } // Capture from user input render texture if (captureSource == CaptureSource.RENDERTEXTURE) { return; } // Create a RenderTexture with desired frame size for dedicated camera capture to store pixels in GPU. outputTexture = Utils.CreateRenderTexture(outputFrameWidth, outputFrameHeight, 24, antiAliasing, outputTexture); // Capture from screen if (captureSource == CaptureSource.SCREEN) { return; } // For capturing normal 2D video, use frameTexture(Texture2D) for intermediate cpu saving, frameRenderTexture(RenderTexture) store the pixels read by frameTexture. regularCamera.targetTexture = outputTexture; // For capture panorama video: // EQUIRECTANGULAR: use cubemapTexture(RenderTexture) for intermediate cpu saving. // CUBEMAP: use texture2D for intermediate cpu saving. if (captureMode == CaptureMode._360) { if (projectionType == ProjectionType.CUBEMAP) { CreateCubemapTextures(); } else { // Create equirectangular textures and materials. CreateEquirectTextures(); } } }
/// <summary> /// Texture settings for cubemap capture. /// </summary> protected void CreateCubemapTextures() { // Create cubemap render target. cubemapRenderTarget = Utils.CreateRenderTexture(outputFrameWidth, outputFrameWidth, 0, antiAliasingSetting, cubemapRenderTarget); cubemapMaterial = Utils.CreateMaterial("VideoCapture/CubemapDisplay", cubemapMaterial); // Create cubemap render texture if (cubemapTexture == null) { cubemapTexture = new RenderTexture(cubemapSize, cubemapSize, 0); cubemapTexture.hideFlags = HideFlags.HideAndDontSave; #if UNITY_5_4_OR_NEWER cubemapTexture.dimension = UnityEngine.Rendering.TextureDimension.Cube; #else cubemapTexture.isCubemap = true; #endif } }
/// <summary> /// Texture settings for equirectangular capture. /// </summary> protected void CreateEquirectTextures() { if (captureMode == CaptureMode._360 && projectionType == ProjectionType.EQUIRECT) { // Create material for convert cubemap to equirectangular. equirectMaterial = Utils.CreateMaterial("VideoCapture/CubemapToEquirect", equirectMaterial); // Create equirectangular render texture. equirectTexture = Utils.CreateRenderTexture(cubemapSize, cubemapSize, 24, antiAliasingSetting, equirectTexture, false); equirectTexture.dimension = UnityEngine.Rendering.TextureDimension.Cube; if (stereoMode != StereoMode.NONE) { // Create stereo equirectangular render texture. stereoEquirectTexture = Utils.CreateRenderTexture(cubemapSize, cubemapSize, 24, antiAliasingSetting, stereoEquirectTexture, false); stereoEquirectTexture.dimension = UnityEngine.Rendering.TextureDimension.Cube; } } }
/// <summary> /// Create the RenderTexture for encoding texture /// </summary> private void CreateRenderTextures() { outputFrameWidth = inputTexture == null ? frameWidth : inputTexture.width; outputFrameHeight = inputTexture == null ? frameHeight : inputTexture.height; if (outputTexture != null && (outputFrameWidth != outputTexture.width || outputFrameHeight != outputTexture.height)) { if (outputTexture) { Destroy(outputTexture); outputTexture = null; } if (equirectTexture) { Destroy(equirectTexture); equirectTexture = null; } if (stereoEquirectTexture) { Destroy(stereoEquirectTexture); stereoEquirectTexture = null; } if (stereoTexture) { Destroy(stereoTexture); stereoTexture = null; } if (stereoOutputTexture) { Destroy(stereoOutputTexture); stereoOutputTexture = null; } if (texture2D) { Destroy(texture2D); texture2D = null; } } // Pixels stored in frameRenderTexture(RenderTexture) always read by frameTexture2D. texture2D = Utils.CreateTexture(outputFrameWidth, outputFrameHeight, texture2D); // Capture from user input texture if (inputTexture != null) { return; } // Create a RenderTexture with desired frame size for dedicated camera capture to store pixels in GPU. outputTexture = Utils.CreateRenderTexture(outputFrameWidth, outputFrameHeight, 24, antiAliasing, outputTexture); // For capturing normal 2D video, use frameTexture(Texture2D) for intermediate cpu saving, frameRenderTexture(RenderTexture) store the pixels read by frameTexture. if (captureMode == CaptureMode.REGULAR) { regularCamera.targetTexture = outputTexture; } // For capture panorama video: // EQUIRECTANGULAR: use cubemapTexture(RenderTexture) for intermediate cpu saving. // CUBEMAP: use texture2D for intermediate cpu saving. else if (captureMode == CaptureMode._360) { cubemapCamera.targetTexture = outputTexture; if (projectionType == ProjectionType.CUBEMAP) { CreateCubemapTextures(); } else { // Create equirectangular textures and materials. CreateEquirectTextures(); } } }
/// <summary> /// Create the RenderTexture for encoding texture /// </summary> private void CreateRenderTextures() { if (captureStarted) { Debug.LogWarningFormat(LOG_FORMAT, "Capture is already started. You can't resize texture and generate new texture"); return; } if (outputFrameWidth != frameWidth || outputFrameHeight != frameHeight) { //Debug.LogFormat(LOG_FORMAT, "Texture size was changed. Need to create new render texture"); if (outputTexture) { Destroy(outputTexture); outputTexture = null; } if (equirectTexture) { Destroy(equirectTexture); equirectTexture = null; } if (stereoEquirectTexture) { Destroy(stereoEquirectTexture); stereoEquirectTexture = null; } if (stereoTexture) { Destroy(stereoTexture); stereoTexture = null; } if (stereoOutputTexture) { Destroy(stereoOutputTexture); stereoOutputTexture = null; } } outputFrameWidth = frameWidth; outputFrameHeight = frameHeight; // Capture from user input texture if (inputTexture != null) { return; } outputTexture = Utils.CreateRenderTexture( outputFrameWidth, outputFrameHeight, 24, antiAliasing, outputTexture); regularCamera.targetTexture = outputTexture; if (captureMode == CaptureMode._360) { if (projectionType == ProjectionType.EQUIRECT) { // Create equirectangular textures and materials. CreateEquirectTextures(); } else if (projectionType == ProjectionType.CUBEMAP) { CreateCubemapTextures(); } } }