Texture


Texture是图形学开发中的一个核心概念,用于在3D模型、UI、地形等物体表面显示图像或图案
它不仅包含颜色信息,还可能包含法线、位移、金属度、粗糙度等各种数据,用于实现丰富的视觉效果

基本概念

  • Texture本质上是一张图片,用于“贴”在模型表面,使其看起来更真实
  • 在GPU层面,是一个二维数组,存储颜色或其他类型的数据

Texture类型

类型描述常见用途
Texture2D最常见的二维纹理UI、模型贴图、Sprite
Texture3D三维纹理体积渲染、噪声函数
Texture2DArray一组相同大小的2D纹理批量渲染、材质变体
Cubemap六面贴图的立方体天空盒、反射
RenderTexture可以被摄像机写入的纹理后处理、实时渲染结果
MovieTexture(已废弃)视频纹理使用 VideoPlayer 替代

导入

在Unity中,图片导入后会成为Texture,可以通过Inspector查看其属性

TextureInspector

1.Texture Type(纹理类型)

  • Default:普通模型贴图
  • Normal Map:法线贴图,用于模拟表面细节
  • Sprite(2D and UI):用于2D项目和UI
  • Cursor:用于鼠标指针
  • Lightmap:烘焙光照图
  • Single Channel:单通道纹理,如Mask

2.Alpha Source

  • 从图片的Alpha通道提取透明度信息

3.Wrap Mode(包裹模式)

  • Repeat:超出部分重复
  • Clamp:超出部分拉伸边缘
  • Mirror:镜像重复

4.Filter Mode(滤波模式)

  • Point(无滤波):像素风格,清晰、锯齿明显
  • Bilinear:线性插值,柔和
  • Trilinear:加上Mipmap,适用于远处材质

5.Aniso Level(各向异性过滤)

  • 提高斜视角下的清晰度(对地板类纹理有用)

6.Max Size & Compression

  • 控制纹理的最大尺寸和压缩格式,影响内存和质量

使用

脚本加载Texture

public Texture2D tex;

void Start()
{
    Renderer renderer = GetComponent<Renderer>();
    renderer.material.mainTexture = tex;
}

或者动态加载

Texture2D tex = Resources.Load<Texture2D>("Textures/MyTexture");

从文件读取图片为Texture

byte[] bytes = File.ReadAllBytes("path/to/image.png");
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(bytes);

RenderTexture与动态渲染

RenderTexture是可以被摄像机实时写入的纹理,用于:

  • 后处理特效(Post Processing)
  • 小地图
  • 反射镜面
  • 安全摄像头

示例

RenderTexture rt = new RenderTexture(256, 256, 16);
Camera.main.targetTexture = rt;

Texture in Graphics

Shader中采样Texture

sampler2D _MainTex;
float frag(v2f i) : SV_Target
{
    float4 color = tex2D(_MainTex, i.uv);
    return color;
}

多通道用途

  • RGBA四个通道可以分别存储不同的数据
    • R:高度
    • G:金属度
    • B:粗糙度
    • A:遮罩

这样节省资源,减少Texture数量

Texture的内存占用

计算方式(未压缩):
宽度 * 高度 * 通道数 * 每通道字节数

压缩后依赖于压缩格式,比如:

  • DXT1:适合无透明度贴图(约1/8压缩)
  • DXT5:支持透明度(约1/4)
  • ASTC、ETC2:移动端更合适

建议

  • 合理压缩纹理,避免内存爆炸
  • 同一材质尽量使用Texture Atlas(图集)
  • UI尽量使用Sprite Atlas
  • 使用Mipmap减少远距离采样时的闪烁
  • 不要在频繁更新的场景中使用Texture2D.SetPixel,效率低下