--- tags: - Texture - Texture2D - RenderTexture --- ### Texture Texture2D RenderTexture 三者关系与差别如下: --- ### 一、继承与本质关系 |类型|基类|存储位置|用途| |---|---|---|---| |**Texture**|基类|GPU|所有纹理的抽象基类| |**Texture2D**|派生自 Texture|GPU|常规 2D 纹理,可读写像素| |**RenderTexture**|派生自 Texture|GPU|可作为渲染目标的纹理| --- ### 二、功能差异 | 特性 | Texture2D | RenderTexture | | -------------------- | --------------------------------------- | -------------------------------------------- | | 是否可被采样(用于材质) | ✔ | ✔ | | 是否可写入(CPU端) | ✔(`SetPixels`/`LoadRawTextureData`) | ✖(仅GPU写) | | 是否可作为渲染目标 | ✖ | ✔(Camera/Graphics.Blit可直接输出) | | 是否支持MipMap | ✔ | ✔(可选) | | 是否可用于ComputeShader读写 | 读可用(`Texture2D`)
写需`RWTexture2D`绑定 | 读写都可(`RenderTexture.enableRandomWrite=true`) | | 是否可保存为文件 | ✔(`EncodeToPNG`/`ReadPixels`) | 需先复制到`Texture2D`再保存 | --- ### 三、常见交互流程 1. **GPU渲染到RenderTexture → 读取像素到Texture2D:** ```CSharp RenderTexture rt = new RenderTexture(512, 512, 0); Camera.main.targetTexture = rt; Camera.main.Render(); Texture2D tex = new Texture2D(512, 512, TextureFormat.RGBA32, false); RenderTexture.active = rt; tex.ReadPixels(new Rect(0, 0, 512, 512), 0, 0); tex.Apply(); RenderTexture.active = null; ``` 此流程用于截图或生成贴图资产。 2. **Texture2D 复制内容到 RenderTexture:** `Graphics.Blit(texture2D, renderTexture);` 仅在shader中使用时保留GPU端数据,不经CPU拷贝。 3. **RenderTexture 作为材质输入:** `material.SetTexture("_MainTex", renderTexture);` --- ### 四、性能与使用建议 - `Texture2D` 适合静态资源(贴图、UI图标、字体图集)。 - `RenderTexture` 适合动态生成(后期处理、离屏渲染、动态阴影、SDF生成)。 - CPU访问`RenderTexture`代价高,应尽量避免频繁`ReadPixels`。 - 若仅GPU间数据流转,用`RenderTexture`或`ComputeBuffer`,不要回读。