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

Unity中如何将RenderTexture转换为一维数组?

Unity中每帧将RenderTexture转换为一维数组并写入CSV的实现

核心转换逻辑

要把GPU上的RenderTexture转成CPU可操作的一维数组,关键是先将纹理数据读取到CPU内存的Texture2D中,再提取像素数组:

  • 临时激活目标RenderTexture为当前渲染目标
  • 创建匹配尺寸和格式的Texture2D,读取当前渲染目标的像素
  • 直接提取Texture2D的一维像素数组(Unity的GetPixels()方法本身返回按行优先排列的一维数组)

完整代码示例

using UnityEngine;
using System.IO;

public class RTToCSVRecorder : MonoBehaviour
{
    public RenderTexture targetRenderTexture;
    private Texture2D readBackTexture;
    private StreamWriter csvWriter;
    private bool isRecording = false;

    void Start()
    {
        // 初始化读取用的Texture2D,匹配RenderTexture的参数
        readBackTexture = new Texture2D(
            targetRenderTexture.width, 
            targetRenderTexture.height, 
            targetRenderTexture.format, 
            false
        );

        // 打开CSV文件并保持写入流,避免频繁IO开销
        string csvPath = Path.Combine(Application.persistentDataPath, "frame_records.csv");
        csvWriter = new StreamWriter(csvPath);
        // 写入表头
        csvWriter.WriteLine("FrameID,PixelData");
    }

    void Update()
    {
        if (!isRecording) return;

        // 1. 切换渲染目标到要读取的RenderTexture
        RenderTexture.active = targetRenderTexture;
        // 2. 读取像素到Texture2D
        readBackTexture.ReadPixels(new Rect(0, 0, targetRenderTexture.width, targetRenderTexture.height), 0, 0);
        readBackTexture.Apply();
        // 3. 获取一维像素数组(float类型,每个通道值范围0-1)
        float[] pixelArray = readBackTexture.GetPixels();

        // 转换为CSV可写入的字符串
        string pixelString = string.Join(",", pixelArray);
        // 写入当前帧数据
        csvWriter.WriteLine($"{Time.frameCount},{pixelString}");

        // 每10帧刷新一次缓冲区,减少磁盘写入频率
        if (Time.frameCount % 10 == 0)
        {
            csvWriter.Flush();
        }
    }

    // 外部调用的录制开关(比如UI按钮触发)
    public void ToggleRecording()
    {
        isRecording = !isRecording;
        if (!isRecording)
        {
            csvWriter.Flush();
            csvWriter.Close();
        }
    }

    void OnDestroy()
    {
        csvWriter?.Close();
        Destroy(readBackTexture);
    }
}

关键注意事项

  • 性能控制:每帧读取RenderTexture属于高开销操作,高分辨率场景下会明显降帧。可以考虑缩小RenderTexture尺寸、每隔N帧采样一次,或者只读取局部区域像素(修改ReadPixels的Rect参数)。
  • 数据量问题:1920×1080的RGBA纹理会生成约830万元素的数组,单帧CSV行长度极大,文件会快速膨胀。如果不需要全量像素,建议只提取关键区域或特征点的像素数据。
  • 格式匹配:必须保证Texture2D的格式与RenderTexture一致,否则读取会出错。若RenderTexture使用压缩格式,建议先转换为非压缩格式再读取。
  • IO优化:始终保持StreamWriter打开状态,避免每帧打开/关闭文件;也可以用List<string>缓存多帧数据,达到一定数量后批量写入,进一步降低磁盘IO开销。

内容的提问来源于stack exchange,提问作者Can Celik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:40:22