You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Oculus设备上使用Texture2D.ReadPixels截图出现空白图像问题

Oculus设备Unity截图空白问题解决方案

核心问题分析

原代码存在三个关键问题导致截图空白:

  1. 路径拼接错误,手动添加的空格会导致文件路径无效
  2. 普通Texture2D.ReadPixels无法适配Oculus的VR立体渲染机制
  3. 纹理尺寸与读取区域不匹配,导致画面读取不完整

解决方案与修复代码

方案一:使用Unity官方VR兼容截图API(推荐)

直接用ScreenCapture.CaptureScreenshot,该方法会自动处理VR场景的双眼画面合成,无需手动操作纹理:

using System.IO;
using UnityEngine;
using System.Collections;

public class OculusScreenshot : MonoBehaviour
{
    public void PressedButton()
    {
        StartCoroutine(TakeScreenshotAndShare());
    }

    private IEnumerator TakeScreenshotAndShare()
    {
        // 等待当前帧渲染完成
        yield return new WaitForEndOfFrame();

        // 生成带时间戳的文件名,避免重复
        string fileName = $"Screenshot{System.DateTime.Now:HHmmss}.png";
        // 正确拼接存储路径
        string savePath = Path.Combine(Application.persistentDataPath, fileName);

        // 执行VR兼容截图
        ScreenCapture.CaptureScreenshot(savePath);

        // 等待文件写入完成
        yield return new WaitForSeconds(0.5f);

        Debug.Log($"截图已保存:{savePath}");
    }
}

方案二:手动读取相机渲染纹理(自定义需求用)

如果需要截取单眼画面或自定义渲染内容,可通过读取相机的渲染目标实现:

using System.IO;
using UnityEngine;
using System.Collections;

public class OculusScreenshot : MonoBehaviour
{
    public Camera vrEyeCamera; // 在Inspector中赋值Oculus的单眼相机(如CenterEyeCamera)

    public void PressedButton()
    {
        StartCoroutine(TakeScreenshotAndShare());
    }

    private IEnumerator TakeScreenshotAndShare()
    {
        yield return new WaitForEndOfFrame();

        // 创建与相机渲染尺寸一致的纹理
        RenderTexture targetRT = vrEyeCamera.targetTexture;
        // 若相机未设置渲染目标,临时创建一个
        if (targetRT == null)
        {
            targetRT = new RenderTexture(Screen.width, Screen.height, 24);
            vrEyeCamera.targetTexture = targetRT;
        }

        Texture2D screenshot = new Texture2D(targetRT.width, targetRT.height, TextureFormat.RGB24, false);
        // 激活渲染纹理以读取像素
        RenderTexture.active = targetRT;
        screenshot.ReadPixels(new Rect(0, 0, targetRT.width, targetRT.height), 0, 0);
        screenshot.Apply();
        // 恢复默认渲染目标
        RenderTexture.active = null;

        // 保存截图
        string fileName = $"Screenshot{System.DateTime.Now:HHmmss}.png";
        string savePath = Path.Combine(Application.persistentDataPath, fileName);
        File.WriteAllBytes(savePath, screenshot.EncodeToPNG());

        Debug.Log($"截图已保存:{savePath}");

        // 释放临时资源
        Destroy(screenshot);
        if (vrEyeCamera.targetTexture == targetRT)
        {
            vrEyeCamera.targetTexture = null;
            Destroy(targetRT);
        }
    }
}

额外注意事项

  • 确保Unity Player Settings中已启用Oculus VR支持,且设备连接正常
  • 使用Application.persistentDataPath无需额外存储权限,适合移动VR设备
  • 若仍出现空白,检查相机的cullingMask是否正确,确保需要截取的物体在相机可见范围内

内容的提问来源于stack exchange,提问作者AJITH KUMAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:30:37