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

RenderTexture转Texture2D仅显单色,如何保留原随机图案?

Unity RenderTexture转Texture2D丢失随机图案问题解决

问题描述

我需要生成一种灰色背景、带有随机位置/大小/颜色方块的纹理,实现逻辑是在Canvas面板实例化400张图片组成随机图案,将Canvas的内容渲染到RenderTexture后删除子对象,以此循环生成新图案。但使用CopyTexture()和ReadPixels()将RenderTexture转为Texture2D时,结果始终是单色——Runtime里明明能看到RenderTexture上的随机图案,调整TextureFormat等参数也没解决问题。

用户原代码

CopyTexture实现:

public Texture2D cachedMask;
public Camera RenderTexCam;
public RenderTexture renTex;

private void Awake()
{
    cachedMask = new Texture2D(256, 256, TextureFormat.RGBA32, true);
    rend = CFSPanel.GetComponent<Renderer>();
    RenderTexCam.Render();
}

void Start(){
Graphics.CopyTexture(renTex, cachedMask);
}

ReadPixels实现:

public Texture2D FromRenTexToTex2D(RenderTexture RenTex)
{
    Texture2D tex = new Texture2D(256, 256, TextureFormat.RGB24, false);
    RenderTexture.active = RenTex;
    tex.ReadPixels(new Rect(0, 0, RenTex.width, RenTex.height), 0, 0);
    tex.Apply();
    return tex;
}

...

cachedMask = FromRenTexToTex2D(renTex);

问题原因&解决步骤

1. 拷贝时机不对,Canvas未完成渲染

Unity的Canvas布局、UI元素渲染需要时间,Start()里直接拷贝时,UI可能还没绘制到RenderTexture上,导致只有背景色。

修正: 用协程延迟一帧再拷贝:

void Start()
{
    StartCoroutine(CopyAfterRender());
}

IEnumerator CopyAfterRender()
{
    // 等一帧让Unity完成UI渲染
    yield return null;
    // 二选一:用CopyTexture或ReadPixels
    Graphics.CopyTexture(renTex, cachedMask);
    // cachedMask = FromRenTexToTex2D(renTex);
}

2. RenderTexture未开启读写权限

如果RenderTexture没开启读写,拷贝操作会静默失败,只能拿到初始背景色。

修正:

  • 编辑器里创建RenderTexture时,勾选Enable Read/Write
  • 代码创建的话加配置:
renTex = new RenderTexture(256, 256, 24);
renTex.enableRandomWrite = true;
renTex.Create();

3. 渲染相机配置错误

相机没正确捕获Canvas内容也会导致拷贝失败:

  • 确保相机Target Texture绑定的是你的renTex
  • Culling Mask要包含UI层(Canvas默认所在层)
  • Orthographic Size调至足够大,能完整显示Canvas内容
  • Clear Flags设为Solid Color,背景色设为目标灰色

4. ReadPixels代码遗漏恢复RenderTexture状态

修改ReadPixels方法,避免影响其他渲染逻辑:

public Texture2D FromRenTexToTex2D(RenderTexture RenTex)
{
    Texture2D tex = new Texture2D(RenTex.width, RenTex.height, TextureFormat.RGBA32, false);
    // 保存原激活的RenderTexture
    RenderTexture originalRT = RenderTexture.active;
    RenderTexture.active = RenTex;
    
    tex.ReadPixels(new Rect(0, 0, RenTex.width, RenTex.height), 0, 0);
    tex.Apply();
    
    // 恢复原状态
    RenderTexture.active = originalRT;
    return tex;
}

5. Canvas渲染模式适配

如果Canvas用的是Screen Space - Overlay,可以改成Screen Space - Camera并直接关联到你的RenderTexCam,确保相机能正确捕获UI内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:47:35