/**
     * Returns what the device's camera is capturing as an RGBA texture.
     */
    public Texture2D GetRealityRGBATexture()
    {
        var appEnvironment = bridge.GetXRAppEnvironment();
        var envTex         = appEnvironment.getManagedCameraTextures().getRgbaTexture();

        if (realityRGBATexture != null &&
            realityRGBATexture.height == envTex.getHeight() &&
            realityRGBATexture.width == envTex.getWidth())
        {
            return(realityRGBATexture);
        }

        // Create a texture
        IntPtr envTexPtr = (IntPtr)envTex.getPtr();

        if (envTexPtr != IntPtr.Zero)
        {
            realityRGBATexture = Texture2D.CreateExternalTexture(
                envTex.getWidth(),
                envTex.getHeight(),
                TextureFormat.RGBA32,
                false,
                false,
                envTexPtr);
        }
        else
        {
            realityRGBATexture = new Texture2D(
                envTex.getWidth(),
                envTex.getHeight(),
                TextureFormat.RGBA32,
                false);
        }

        captureAspect = envTex.getWidth() * 1.0f / envTex.getHeight();

        // Set point filtering just so we can see the pixels clearly
        realityRGBATexture.filterMode = FilterMode.Point;
        // Call Apply() so it's actually uploaded to the GPU
        realityRGBATexture.Apply();

        if (envTexPtr == IntPtr.Zero)
        {
            // Pass texture pointer to the plugin only if it doesn't manage one itself.
            bridge.SetManagedCameraRGBATexture(
                realityRGBATexture.GetNativeTexturePtr(),
                realityRGBATexture.width,
                realityRGBATexture.height,
                GetRenderingSystem());
        }

        return(realityRGBATexture);
    }