2.7 KiB
2.7 KiB
tags
| tags | |||
|---|---|---|---|
|
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再保存 |
三、常见交互流程
-
GPU渲染到RenderTexture → 读取像素到Texture2D:
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;此流程用于截图或生成贴图资产。
-
Texture2D 复制内容到 RenderTexture:
Graphics.Blit(texture2D, renderTexture);仅在shader中使用时保留GPU端数据,不经CPU拷贝。
-
RenderTexture 作为材质输入:
material.SetTexture("_MainTex", renderTexture);
四、性能与使用建议
-
Texture2D适合静态资源(贴图、UI图标、字体图集)。 -
RenderTexture适合动态生成(后期处理、离屏渲染、动态阴影、SDF生成)。 -
CPU访问
RenderTexture代价高,应尽量避免频繁ReadPixels。 -
若仅GPU间数据流转,用
RenderTexture或ComputeBuffer,不要回读。