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

Unity中OnRenderImage如何将源纹理复制到目标纹理?

解决Unity OnRenderImage导致黑屏的问题

你的核心问题是没有正确完成OnRenderImage中源纹理到目标纹理的传递,以下是具体解决方案和原因说明:

为什么当前代码会黑屏?

  • 直接赋值dest = src完全无效:dest是方法的传入参数,你修改的只是局部变量的引用,并没有实际把src的像素数据写入到真正的目标渲染纹理中,导致最终没有画面输出。
  • Graphics.CopyTexture报错是因为src和dest的纹理格式/类型不匹配(比如一个是带深度缓冲的渲染纹理,另一个是普通纹理),这个API要求严格的格式一致,不适合用来完成OnRenderImage中的画面传递。

正确的实现方式

使用**Graphics.Blit**是Unity设计OnRenderImage方法时的标准做法,它会自动处理格式转换,把源纹理的内容绘制到目标纹理中,保证画面正常输出。同时你可以在Blit之前对src纹理进行读取操作,完全不影响最终显示。

修改后的完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraRenderToImage : MonoBehaviour
{
    private int counter;

    void Start()
    {
        counter = 0;
    }

    void OnRenderImage(RenderTexture src, RenderTexture dest)
    {
        Debug.Log("Render finalized " + counter);
        counter++;

        // 在这里添加你对src纹理的访问逻辑,比如读取像素数据
        AccessRenderTextureData(src);

        // 关键:用Blit完成源到目标的画面传递,保证屏幕正常显示
        Graphics.Blit(src, dest);
    }

    // 示例:读取src纹理的像素数据
    private void AccessRenderTextureData(RenderTexture src)
    {
        // 激活当前的RenderTexture,这样ReadPixels会读取它的内容
        RenderTexture.active = src;
        
        // 创建对应尺寸的Texture2D来存储像素
        Texture2D captureTex = new Texture2D(src.width, src.height, TextureFormat.RGB24, false);
        // 读取整个RenderTexture的像素
        captureTex.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0);
        // 应用像素修改
        captureTex.Apply();
        
        // 这里可以对captureTex进行处理,比如保存为图片、分析像素等
        // 示例:保存到本地(可选)
        // byte[] pngData = captureTex.EncodeToPNG();
        // System.IO.File.WriteAllBytes(Application.persistentDataPath + "/capture_" + counter + ".png", pngData);
        
        // 记得释放资源,避免内存泄漏
        Destroy(captureTex);
        // 恢复之前激活的RenderTexture(如果有的话)
        RenderTexture.active = null;
    }
}

额外说明

  • 不要用构造函数初始化变量:Unity的MonoBehaviour脚本应该用Start或Awake来初始化,而不是构造函数,因为构造函数的执行时机不受Unity生命周期控制。
  • 如果不需要处理像素数据,只是要保证画面正常输出,只保留Graphics.Blit(src, dest)即可,其他逻辑按需添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:30:42