Version: 2019.4
纹理类型
渲染纹理

特定于平台的覆盖的纹理压缩格式

Unity 支持许多常见的图像格式作为导入纹理的源文件(例如 JPG、PNG、PSD 和 TGA)。但是,3D 图形硬件(例如显卡或移动设备)在实时渲染期间不会使用这些格式。这种硬件要求纹理以专门格式进行压缩,这些格式针对快速纹理采样进行了优化。不同的平台和设备分别都有自己的专有格式。

默认情况下,Unity Editor 会自动将纹理转换为最合适的格式,以匹配您选择的构建目标,而且构建中仅包含转换后的纹理。源资源文件保留为原始格式,位于项目的 Assets 文件夹中。但是,大多数平台支持多种纹理压缩格式,可供您进行选择。

Unity 为每个平台设置了默认格式,但您可以覆盖默认格式并为某些纹理选择不同的压缩格式(例如,如果使用纹理作为遮罩,只有一个通道,则可以选择使用 BC4 格式来降低文件大小,但同时保持质量)。

本页包含以下信息:


有关导入纹理以及如何设置覆盖的一般信息,请参阅纹理导入设置 (Texture Import Settings)

纹理压缩概念

本页用到了以下概念:

  1. RGB 是一种颜色模型,其中红色、绿色和蓝色通过各种方式叠加在一起以再现各种颜色。
  2. RGBA 是具有 Alpha 通道的 RGB 版本,支持混合和不透明度更改。
  3. 每像素位数 (bpp) 表示单个像素所需的存储量。该值越低,可以在 GPU 的缓存中存储的像素越多,从而可以更快地访问纹理。
  4. 可变比特率 (VBR) 表示每像素的位数不是固定值,而是取决于实际内容。VBR 仅适用于 Crunch 压缩,仅限于磁盘上的纹理大小。内存中的大小与使用基础纹理格式时的大小相同(例如,RGB Compressed DXT1 对应 RGB Crunched DXT1)。
  5. Crunch 压缩是一种基于 DXT 或 ETC 纹理压缩的有损压缩格式(压缩过程中会丢失部分数据)。在运行时,纹理在 CPU 上解压缩为 DXT 或 ETC,然后上传到 GPU。Crunch 压缩有助于纹理在磁盘上使用尽可能少的空间,但对于运行时内存使用量没有影响。Crunch 纹理可能需要很长时间进行压缩,但在运行时的解压缩速度非常快。

受支持平台的默认格式

下表显示了每个平台使用的默认格式。

平台 颜色模型 正常质量(默认设置) 高质量 低质量(更高性能)
Windows、Linux、macOS、PS4、XBox One RGB RGB 24 位 RGB Compressed DXT1 RGB(A) Compressed BC7 RGB Compressed DXT1
RGBA RGBA 32 位 RGBA Compressed DXT5 RGB(A) Compressed BC7 RGBA Compressed DXT5
HDR RGBA Half RGB Compressed BC6H RGB Compressed BC6H RGB Compressed BC6H
WebGL RGB RGB 24 位 RGB Compressed DXT1 RGB Compressed DXT1 RGB Compressed DXT1
RGBA RGBA 32 位 RGBA Compressed DXT5 RGBA Compressed DXT5 RGBA Compressed DXT5
Android(仅当在构建设置中启用了 Don’t override 时) RGB RGB 24 位 RGB Compressed ETC RGB Compressed ETC RGB Compressed ETC
RGBA RGBA 32 位 RGBA Compressed ETC2 RGBA Compressed ETC2 RGBA Compressed ETC2
iOS RGB RGB 24 位 RGB Compressed PVRTC 4 位 RGB Compressed PVRTC 4 位 RGB Compressed PVRTC 2 位
RGBA RGBA 32 位 RGBA Compressed PVRTC 4 位 RGBA Compressed PVRTC 4 位 RGBA Compressed PVRTC 2 位
tvOS RGB RGB 24 位 RGB Compressed ASTC 6x6 块 RGB Compressed ASTC 4x4 块 RGB Compressed ASTC 8x8 块
RGBA RGBA 32 位 RGBA Compressed ASTC 6x6 块 RGBA Compressed ASTC 4x4 块 RGBA Compressed ASTC 8x8 块
Default RGBA RGBA 32 位 RGBA 16 位 RGBA 16 位 RGBA 16 位

所有支持的纹理压缩格式

下表显示了每个平台上可用的纹理压缩格式选项以及磁盘上生成的压缩文件大小(基于 256x256 像素图像)。

选择纹理压缩格式需要在文件大小、质量和压缩时间之间取得平衡:质量越高,文件越大。为了获得最佳性能,尤其是在移动设备上,请使用应用程序的目标硬件所支持的每像素位数最少的格式,只要该格式能够提供足够的视觉质量即可。

不同平台有不同的硬件,并经优化后可最有效地处理特定压缩格式。使用目标平台支持的纹理压缩格式时,GPU 可以直接使用该格式,并且平台不用消耗任何资源即可将纹理解压缩为支持的格式。这样可以提高应用程序的性能。

如果使用目标平台不支持的纹理压缩格式,纹理将解压缩为 RGBA 32 位(除非另有说明)并与压缩纹理一起存储在内存中。这会增加纹理加载时间并使用额外的内存,这意味着选择不兼容的格式可能会影响应用程序的性能。

下表显示了每种压缩格式支持的平台。

注意:在内存中的大小基于 256x256 像素纹理。

纹理压缩格式 描述 在内存中的大小 Windows Linux Mac PS4 Xbox One Android iOS tvOS WebGL
RGB Compressed DXT1 压缩无符号标准化整数 RGB 纹理。 32KB / 4 bpp 部分 (1) 部分 (2)
RGB Crunched DXT1 RGB 压缩 DXT1,以及额外的 Crunch 压缩。 VBR 部分 (1) 部分 (2)
RGBA Compressed DXT5 压缩无符号标准化整数 RGBA 纹理。 64KB / 8 bpp 部分 (1) 部分 (2)
RGBA Crunched DXT5 RGBA 压缩 DXT5,以及额外的 Crunch 压缩。 VBR 部分 (1) 部分 (2)
RGB Compressed BC6H 压缩无符号浮点/高动态范围 (HDR) RGB 纹理。 64KB / 8 bpp 部分 (3) 部分 (3)
RGB(A) Compressed BC7 高质量压缩无符号标准化整数 RGB 或 RGBA 纹理。 64KB / 8 bpp 部分 (3) 部分 (3)
RGB 16 位 未压缩格式,65536 色,无 Alpha。使用比压缩格式更多的内存,但可能更适合没有渐变的 UI 或清晰纹理。 128KB / 16 bpp
RGB 24 位 真实色彩,无 Alpha。 192KB / 24 bpp
RGB9e5 32 位共享指数浮点 浮点 / 高动态范围 (HDR) 纹理,无 Alpha 通道。 256 KB / 32 bpp 部分 (4) 部分 (4) 部分 (4) 部分 (4)
Alpha 8 高质量未压缩 Alpha 通道。 64KB / 8 bpp
R 8 高质量未压缩单通道纹理。 64KB / 8 bpp 部分 (5) 部分 (5) 部分 (5) 部分 (5)
R 16 位 超高质量未压缩单通道纹理。 128KB / 16 bpp 部分 (6) 部分 (6) 部分 (6)
RGBA 16 位 低质量真实色彩。 128KB / 16 bpp
RGBA 32 位 真实色彩,并有 Alpha。 256KB / 32 bpp
RGBA Half 半精度浮点 / 高动态范围 (HDR) RGBA 格式。 512KB / 64bpp 部分 (7) 部分 (7) 部分 (7) 部分 (7)

注意:

  1. 仅限在 Nvidia Tegra GPU 上。
  2. 在不支持 sRGB DXT 的 Web 浏览器上使用线性渲染,纹理在运行时被解压缩为 RGBA32。
  3. Windows Direct3D 11、Windows OpenGL 4 和 macOS Metal。在具有 Direct3D 10 着色器模型 4 和 OpenGL 3 GPU 的平台 (Windows) 上以及在 macOS OpenGL 上,BC6H 纹理被解压缩为 RGBA Half,而 BC7 纹理被解压缩为 RGBA32。
  4. 在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或 Nvidia Tegra;WebGL 2。
  5. 在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或 GL_EXT_texture_rg 扩展;需要 WebGL 2。
  6. 在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 和 GL_EXT_texture_norm16 扩展。
  7. 在 iOS 和 tvOS 上需要 Metal;在 Android 上需要 Vulkan、OpenGL ES 3.0 或 GL_OES_texture_half_float 扩展;需要 WebGL 2 或 WebGL 上的 OES_texture_half_float 扩展。

可从 DDS 文件导入纹理,但仅支持 DXT、BC 压缩格式或未压缩像素格式。

移动端和 WebGL 特有格式

下表中的格式仅在 Android、iOS、tvOS 和 WebGL 上受支持。

注意:大小基于 256x256 像素纹理。

纹理压缩格式 描述 大小 Android iOS tvOS WebGL
RGB Compressed ETC 压缩 RGB 纹理。所有 OpenGL ES 2.0 GPU 都支持该格式。 32KB / 4 bpp 部分 (1)
RGB Crunched ETC RGB 压缩 ETC,以及额外的 Crunch 压缩。 VBR 部分 (1)
RGB Compressed ETC2 压缩 RGB 纹理。 32KB / 4 bpp 部分 (2) 部分 (3) 部分 (3) 部分 (1)
RGBA Compressed ETC2 压缩 RGBA 纹理。所有 OpenGL ES 3.0 GPU 都支持该格式。 64KB / 8 bpp 部分 (2) 部分 (3) 部分 (3) 部分 (1)
RGBA Crunched ETC2 RGBA 压缩 ETC2,以及额外的 Crunch 压缩。 VBR 部分 (2) 部分 (3) 部分 (3) 部分 (1)
RGB + 1 位 Alpha Compressed ETC2 4 位 采用 Alpha 通道的压缩 RGBA 纹理被限制为完全不透明或完全透明。 32KB / 4 bpp 部分 (2) 部分 (3) 部分 (3) 部分 (1)
RG Compressed EAC 8 位 高质量压缩 RG(双通道)纹理。 64KB / 8 bpp 部分 (2) 部分 (3) 部分 (3) 部分 (1)
R Compressed EAC 4 位 高质量压缩 R(单通道)纹理。 32KB / 4 bpp 部分 (2) 部分 (3) 部分 (3) 部分 (1)
RGB(A) Compressed ASTC 可变块大小压缩 RGB 或 RGBA 纹理。所有 OpenGL ES 3.1 和 Vulkan GPU 都支持该格式。 12x12:7744 字节 / 0.89 bpp

10x10:10816 字节 / 1.28 bpp

8x8:16KB / 2 bpp

6x6:29584 字节 / 3.56 bpp

5x5:43264 字节 / 5.12 bpp

4x4:64KB / 8 bpp
部分 (4) 部分 (5) 部分 (6)
RGB(A) Compressed ASTC HDR 可变块大小压缩无符号浮点/高动态范围 (HDR) RGB 或 RGBA 纹理。 12x12:7744 字节 / 0.89 bpp

10x10:10816 字节 / 1.28 bpp

8x8:16KB / 2 bpp

6x6:29584 字节 / 3.56 bpp

5x5:43264 字节 / 5.12 bpp

4x4:64KB / 8 bpp
部分 (7)
RGB Compressed PVRTC 2 位 (8) 高压缩 RGB 纹理。 16KB / 2 bpp 部分 (9)
RGBA Compressed PVRTC 2 位 高压缩 RGBA 纹理。 16KB / 2 bpp 部分 (9)
RGB Compressed PVRTC 4 位 压缩 RGB 纹理。 32KB / 4 bpp 部分 (9)
RGBA Compressed PVRTC 4 位 压缩 RGBA 纹理。 32KB / 4 bpp 部分 (9)

注意:

  1. 只有少部分浏览器在 WebGL 上支持 ETC1 和 ETC2/EAC。
  2. 运行 OpenGL ES 2 时,Android 不支持ETC2。在这种情况下,纹理在运行时解压缩为 Android Build Settings 中的 ETC2 fallback 指定的格式,或者 Platform-specific overrides 面板的 Android 选项卡上指定的格式。
  3. 运行 OpenGL ES 2 时,iOS 和 tvOS 不支持 ETC2。
  4. 需要 GL_KHR_texture_compression_astc_ldr 扩展或 Vulkan 支持。
  5. 需要 A8 GPU 或更高版本。
  6. 需要 WEBGL_compressed_texture_astc 扩展。
  7. 需要 GL_KHR_texture_compression_astc_hdr 扩展。如果不支持此扩展,则纹理将在运行时解压缩为 RGB9E5 格式,从而失去了 Alpha 通道。
  8. 所有 PVRTC 格式都需要具有二次幂尺寸正方形纹理。
  9. 仅限在 PowerVR GPU 上。

关于 iOS 的注意事项

选择默认的纹理压缩设置 (PVRTC) 可获得更大的兼容性。如果您的应用程序不包含 OpenGL ES 2 支持,则可以选择一种 ASTC 格式。这些格式提供更好的质量和灵活性,并且压缩速度比 PVRTC 快。

关于 tvOS 的注意事项

Unity 仅支持具有 Metal 支持的 tvOS 设备。该平台上的默认纹理压缩格式是 ASTC。如果手动添加 OpenGL ES 2,请确保将纹理压缩格式更改为 PVRTC 或 ETC,以免在运行时进行纹理解压缩。

关于 Android 的注意事项

常规纹理

除非您的应用程序针对的是特定硬件(例如 Nvidia Tegra 或 Imagination PowerVR),否则必须在几种压缩格式和未压缩格式之间进行选择,这种情况下需要考虑不同的取舍因素:

格式 描述 支持
ASTC 最灵活的格式,允许您使用不同的块大小来微调文件大小和产生的质量。 在运行 Vulkan 或 OpenGL ES 3.1 的所有设备上以及在运行 OpenGL ES 3.0 的部分设备上受支持。
ETC2/EAC OpenGL ES 3.0 的标准纹理压缩格式。产生的图像质量非常高,并且支持一到四分量纹理数据。OpenGL ES 2 设备不支持这种格式,因此纹理在运行时被解压缩为 ETC2 fallback 指定的格式。 在 OpenGL ES 3.0 上受支持。
在 OpenGL ES 2 上不受支持。
ETC 基于块的纹理压缩格式。图像被分成 4×4 的块,并且每个块使用固定的位数进行编码。缺点是没有直接的 Alpha 通道支持,因此不适合具有透明度信息的纹理。Unity 提供了一种自动处理纹理的方法,这种方法将 Alpha 通道放在纹理图集内(可以在精灵上使用打包标签来指定这一点)。

为此,请在导入精灵图集时为纹理启用特定于 Android 的 Split Alpha Channel 选项。Unity 会将生成的图集拆分为两个纹理,其中一个纹理含有 RGB 数据,另一个纹理含有在所有三个 (RGB) 通道中重复的 Alpha 通道数据,然后在渲染管线的最后部分将这两个纹理组合起来。
在所有 Android 设备上都受支持。
RGBA 16 位 具有 Alpha 通道的未压缩格式。这种格式占用的内存是 ETC2 的两倍。对于没有强渐变且像素完美的 UI,这是一种相当不错的格式。 在所有设备上都受支持。
RGBA 32 位 未压缩的格式,可提供最高质量并具有 Alpha 通道支持。与 ETC2 相比,这种格式需要四倍的内存。这种格式适合外观最佳、像素完美的 UI。 在所有设备上都受支持。

HDR 纹理

对于高动态范围 (HDR) 纹理,请从以下格式中进行选择:

  • ASTC HDR 是 Android 设备上唯一可用于 HDR 纹理的压缩格式。这种格式需要 Vulkan 或 GL_KHR_texture_compression_astc_hdr 支持。与低动态范围纹理一样,这是最灵活的格式。
  • RGB9e5 是一种打包格式,不含 Alpha 通道。所有运行 Vulkan 或 OpenGL ES 3.0 的设备以及搭载 Nvidia Tegra GPU 的设备都支持这种格式。
  • RGBA Half 是半精度的未压缩浮点格式。这种格式占用的内存是 RGB9e5 的两倍,但具有一个 Alpha 通道,并且受到大多数设备的支持。

以不同的 APK 发布到多种设备

您可以发布以不同硬件为目标的多个 Android 包 (APK)。例如,要发布两个单独的 APK(一个适用于支持 OpenGL ES 3.0 及更高版本的设备,另一个适用于仅支持 OpenGL ES 2.0 的设备),请按照以下步骤操作:

1.构建一个以 OpenGL ES 3 为目标的 APK。

  1. 访问 Android 的 Player Settings(菜单:Edit > Project Settings > Player Settings,然后选择 Android 类别)。
  2. 向下滚动到 Graphics APIs 部分。
  3. 确保 OpenGL ES 2 不在列表中。
  4. 构建 APK(菜单:File > Build Settings,然后单击 Build)。

2.构建一个以 OpenGL ES 2 为目标的单独 APK。

  1. 访问 Android Player Settings。
  2. 向下滚动到 Graphics APIs 部分。
  3. 在列表中添加 OpenGL ES 2 并删除 OpenGL ES 3 和 Vulkan。
  4. 构建 APK。

3.将这两个 APK 发布到 Google Play 应用商店。

当用户下载应用程序时,Google Play 应用商店会自动为其设备安装最相关的 APK。

有关发布多个 APK 文件的更多信息,请参阅 Android 开发者文档中的以下主题:



  • 2017.2 中添加了适用于 WebGL 的线性渲染 NewIn20172

  • 2017.3 版中更新了 Crunch 压缩格式 NewIn20173

  • 2017.3 中停止了 Tizen 和三星电视 (Samsung TV) 支持 NewIn20173

  • 2019.1 中添加了适用于 Android 的 ASTC HDR 纹理压缩 NewIn20191

  • 针对 Unity 2019.3 更新了内容 NewIn20193

纹理类型
渲染纹理