33. RenderTarget

1.RenderTarget简介

2.RenderTarget示例

3.RenderTarget要点


1.RenderTarget简介

csharp 复制代码
RenderTarget(简称RT, 渲染目标)本质是"显存中的一块缓冲区/虚拟画布"

默认情况下, Unity的相机直接把画面渲染到"屏幕缓冲区", 而RenderTarget允许你让相机把画面渲染到这块"虚拟画布",而

非直接显示, 这块画布的具体实现是Unity的"RenderTexture"类; 渲染完成后, 可以将它作为纹理采样, 二次处理或最终再

渲染到屏幕上

简单类比:正常画画是直接画在最终展示的画布(屏幕)上, 而RenderTarget是先画在草稿纸(虚拟画布)上, 修改/合成后再复

制到最终画布

2.RenderTarget示例

csharp 复制代码
using UnityEngine;

public class RenderTargetDemo : MonoBehaviour
{
    // 用于渲染到RT的相机(需在场景中指定)
    public Camera renderCamera;
    // 显示RT内容的平面(挂MeshRenderer组件)
    public GameObject displayPlane;
    // 动态创建的RenderTarget(RenderTexture)
    private RenderTexture _renderTarget;

    void Start()
    {
        // 1. 创建RenderTarget(核心参数:分辨率、深度缓冲区、纹理格式)
        // 分辨率:1024x1024足够,过高会增加显存占用;深度缓冲区24=标准值(支持深度测试)
        _renderTarget = new RenderTexture(1024, 1024, 24, RenderTextureFormat.ARGB32);
        // 可选:开启4倍抗锯齿(MSAA),注意显存消耗
        _renderTarget.antiAliasing = 4;
        // 标记为临时资源,方便Unity管理(仍需手动释放)
        _renderTarget.hideFlags = HideFlags.HideAndDontSave;

        // 2. 让相机渲染到RT(而非屏幕)
        renderCamera.targetTexture = _renderTarget;
        // 关闭相机的屏幕显示(只渲染到RT)
        renderCamera.enabled = true;

        // 3. 将RT赋值给平面材质,显示RT内容
        if (displayPlane != null && displayPlane.TryGetComponent(out MeshRenderer planeMr))
        {
            Material planeMat = planeMr.material;
            planeMat.mainTexture = _renderTarget; // RT作为材质纹理
        }
    }

    // 关键:销毁时释放RT,避免显存泄漏(新手最易踩坑)
    void OnDestroy()
    {
        if (_renderTarget != null)
        {
            RenderTexture.ReleaseTemporary(_renderTarget); // 释放显存资源
            _renderTarget = null;
        }
        // 恢复相机默认渲染到屏幕(可选)
        if (renderCamera != null)
        {
            renderCamera.targetTexture = null;
        }
    }
}
csharp 复制代码
a.RenderTexture构造参数: 宽度/高度决定RT分辨率(1024x1024的ARGB32格式RT约占4MB显存), 深度缓冲区设为0则无法处

理物体遮挡

b.camera.targetTexture: 这是使用RT的核心设置, 将相机输出重定向到RT

c.RenderTexture.ReleaseTemporary: 必须手动释放RT资源, 否则频繁创建会导致显存泄漏, 最终触发内存溢出

3.RenderTarget要点

csharp 复制代码
a.控制RT分辨率: 不要无脑用4KRT, 比如镜面反射用512x512、小地图用256x256足够, 分辨率减半, 显存占用减少75%

b.选择轻量化格式

- 普通渲染用ARGB32(4字节/像素)

- 仅需亮度信息用R8(1字节/像素)

- 高精度特效(HDR)用RGBAHalf(8字节/像素), 避免过度使用

c.复用 RT: 创建全局RT池, 重复使用同一RT, 避免每帧创建/销毁(显存分配开销极大)

d.关闭无用功能: 不需要深度测试的RT, 比如: UI渲染, 将深度缓冲区设为0; 不需要抗锯齿的RT, 关闭MSAA
相关推荐
寂寞的船1 天前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
寂寞的船2 天前
【Unity Bug挑战】第12期 Awaitable 二次 await 死锁之谜 —— 为什么同一个异步操作等两次就卡死?
unity·c#·游戏引擎·bug
探求虚无3 天前
用 AI 在 Unity 里做一款 RTS:最难的不是生成代码,而是证明它真的能玩
人工智能·unity·游戏引擎
17岁的勇气4 天前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
寂寞的船5 天前
【Unity知识速递】第10期 Unity GC 零分配实战:从 UnityEngine.Pool 到手动 GC 控制的全链路优化
jvm·unity·c#·游戏引擎·lucene
寂寞的船7 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
寂寞的船8 天前
【Unity知识速递】第5期 Unity 6.2 深度解析:AI Assistant 登场,World Space UI 与 Sentis 全面升级
人工智能·ui·unity
寂寞的船8 天前
【Unity知识速递】第4期 MCP for Unity:用 AI 自然语言控制编辑器
人工智能·unity·编辑器
淡海水8 天前
09-04-内存-Unity原生对象生命周期
unity·c#·游戏引擎·gc
寂寞的船8 天前
【Unity知识速递】第6期 URP性能优化完全指南:从内存到GPU的三维调优
unity·性能优化·编辑器