在渲染任何 ARCore 模型之前截取屏幕截图

Take Screenshot Before any ARCore model is rendered

我正在使用屏幕截图代码截取屏幕截图,它工作正常,但它也使用了 arcore 模型。有没有办法在渲染模型之前截取屏幕截图?

我试过 SetActive(false) 然后截图然后 SetActive(true),它确实有效,但有一个明显的区别,即模型消失而不是重新出现。

更新:这是一个应用在ScreenShotCamera上的脚本,它在删除所有错误后更新(感谢@Shingo),请随意使用它它工作正常

using GoogleARCore;
using OpenCVForUnitySample;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

[RequireComponent(typeof(Camera))]
public class SnapshotCamera : MonoBehaviour
{
    Camera snapCam;
    public UnityEngine.UI.Text text;
    public RenderTexture mRenderTexture;
    int resWidth=480;
    int resHeight=800;

    // Start is called before the first frame update
    public void initialize(ARBackgroundRenderer background, Material material)
    {
        background = new ARBackgroundRenderer();
        snapCam = GetComponent<Camera>();
        background.backgroundMaterial = material;
        background.camera = snapCam;
        background.mode = ARRenderMode.MaterialAsBackground;
        if (snapCam.targetTexture == null)
        {
            snapCam.targetTexture = new RenderTexture(resWidth, resHeight, 24);
        }
        else
        {
            snapCam.targetTexture.height = resHeight;
            snapCam.targetTexture.width = resWidth;
            //resHeight = snapCam.targetTexture.height;
            //resWidth = snapCam.targetTexture.width;
        }
        background.camera.cullingMask = LayerMask.NameToLayer("Default");
        //snapCam.CopyFrom(background.camera);

        snapCam.gameObject.SetActive(false);
    }

    public void TakeSnapShot()
    {
        snapCam.gameObject.SetActive(true);
    }

    void LateUpdate()
    {
        if (snapCam.gameObject.activeInHierarchy)
        {
            snapCam.cullingMask = LayerMask.NameToLayer("Default");
            if (ARCoreBackgroundRenderer.screenShot == null)
                ARCoreBackgroundRenderer.screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false);
            snapCam.Render();
            RenderTexture.active = snapCam.targetTexture;
            ARCoreBackgroundRenderer.screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0);
            ARCoreBackgroundRenderer.screenShot.Apply();

            snapCam.gameObject.SetActive(false);
            HandPoseRecognition.captureTexture = false;

            //string name = string.Format("{0}_Capture{1}_{2}.png", Application.productName, "{0}", System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
            //UnityEngine.Debug.Log("Permission result: " + NativeGallery.SaveImageToGallery(ARCoreBackgroundRenderer.screenShot, Application.productName + " Captures", name));
        }
    }
}

可能我说的有点含糊,你在评论中提到的问题已经在你的帮助下解决了,但现在的问题是。 我给你看图片: 这些是我拥有的 2 台相机:

这是我的 Main (ARCore Camera) 显示的内容

这就是(截屏相机)显示的内容

你可以使用layer,将每个arcore模型放在一个层中(例如ARLAYER),然后设置camera的culling mask来避开这些模型。

伪代码:

// Set models' layer
foreach (GameObject arcoreModel in arcoreModels)
     arcoreModel.layer = ARLAYER;

// Set camera's culling mask
camera.cullingMask = ~(1 << ARLAYER);
camera.Render();

从另一个相机创建屏幕截图相机

var go = new GameObject("screenshotcamera");
// Copy transform
go.transform.position = mainCamera.transform.position.
...
// Copy camera
var screenshotcamera= go.AddComopnent<Camera>();
screenshotcamera.CopyFrom(mainCamera);

使用脚本更新

snapCam = GetComponent<Camera>();