Unity-特定于平台的覆盖的纹理压缩格式
Unity 支持许多常见的图像格式作为导入纹理的源文件(例如 JPG、PNG、PSD 和 TGA)。但是,3D 图形硬件(例如显卡或移动设备)在实时渲染期间不会使用这些格式。这种硬件要求纹理以专门格式进行压缩,这些格式针对快速纹理采样进行了优化。不同的平台和设备分别都有自己的专有格式。
默认情况下,Unity Editor 会自动将纹理转换为最合适的格式,以匹配您选择的构建目标,而且构建中仅包含转换后的纹理。源资源文件保留为原始格式,位于项目的 Assets
文件夹中。但是,大多数平台支持多种纹理压缩格式,可供您进行选择。
Unity 为每个平台设置了默认格式,但您可以覆盖默认格式并为某些纹理选择不同的压缩格式(例如,如果使用纹理作为遮罩,只有一个通道,则可以选择使用 BC4 格式来降低文件大小,但同时保持质量)。
本页包含以下信息:
纹理压缩概念
受支持平台的默认格式
所有支持的纹理压缩格式
移动端和 WebGL 特有格式
关于 iOS 的注意事项
关于 tvOS 的注意事项
关于 Android 的注意事项
有关导入纹理以及如何设置覆盖的一般信息,请参阅纹理导入设置 (Texture Import Settings)。
纹理压缩概念
本页用到了以下概念:
RGB 是一种颜色模型,其中红色、绿色和蓝色通过各种方式叠加在一起以再现各种颜色。
RGBA 是具有 Alpha 通道的 RGB 版本,支持混合和不透明度更改。
每像素位数 (bpp) 表示单个像素所需的存储量。该值越低,可以在 GPU 的缓存中存储的像素越多,从而可以更快地访问纹理。
可变比特率 (VBR) 表示每像素的位数不是固定值,而是取决于实际内容。VBR 仅适用于 Crunch 压缩,仅限于磁盘上的纹理大小。内存中的大小与使用基础纹理格式时的大小相同(例如,RGB Compressed DXT1 对应 RGB Crunched DXT1)。
Crunch 压缩是一种基于 DXT 或 ETC 纹理压缩的有损压缩格式(压缩过程中会丢失部分数据)。在运行时,纹理在 CPU 上解压缩为 DXT 或 ETC,然后上传到 GPU。Crunch 压缩有助于纹理在磁盘上使用尽可能少的空间,但对于运行时内存使用量没有影响。Crunch 纹理可能需要很长时间进行压缩,但在运行时的解压缩速度非常快。
受支持平台的默认格式
下表显示了每个平台使用的默认格式。

所有支持的纹理压缩格式
下表显示了每个平台上可用的纹理压缩格式选项以及磁盘上生成的压缩文件大小(基于 256x256 像素图像)。
选择纹理压缩格式需要在文件大小、质量和压缩时间之间取得平衡:质量越高,文件越大。为了获得最佳性能,尤其是在移动设备上,请使用应用程序的目标硬件所支持的每像素位数最少的格式,只要该格式能够提供足够的视觉质量即可。
不同平台有不同的硬件,并经优化后可最有效地处理特定压缩格式。使用目标平台支持的纹理压缩格式时,GPU 可以直接使用该格式,并且平台不用消耗任何资源即可将纹理解压缩为支持的格式。这样可以提高应用程序的性能。
如果使用目标平台不支持的纹理压缩格式,纹理将解压缩为 RGBA 32 位(除非另有说明)并与压缩纹理一起存储在内存中。这会增加纹理加载时间并使用额外的内存,这意味着选择不兼容的格式可能会影响应用程序的性能。
下表显示了每种压缩格式支持的平台。
注意:在内存中的大小基于 256x256 像素纹理。

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

注意:
只有少部分浏览器在 WebGL 上支持 ETC1 和 ETC2/EAC。
运行 OpenGL ES 2 时,Android 不支持ETC2。在这种情况下,纹理在运行时解压缩为 Android Build Settings 中的 ETC2 fallback 指定的格式,或者 Platform-specific overrides 面板的 Android 选项卡上指定的格式。
运行 OpenGL ES 2 时,iOS 和 tvOS 不支持 ETC2。
需要 GL_KHR_texture_compression_astc_ldr 扩展或 Vulkan 支持。
需要 A8 GPU 或更高版本。
需要 WEBGL_compressed_texture_astc 扩展。
需要 GL_KHR_texture_compression_astc_hdr 扩展。如果不支持此扩展,则纹理将在运行时解压缩为 RGB9E5 格式,从而失去了 Alpha 通道。
所有 PVRTC 格式都需要具有二次幂尺寸的正方形纹理。
仅限在 PowerVR GPU 上。
关于 iOS 的注意事项
选择默认的纹理压缩设置 (PVRTC) 可获得更大的兼容性。如果您的应用程序不包含 OpenGL ES 2 支持,则可以选择一种 ASTC 格式。这些格式提供更好的质量和灵活性,并且压缩速度比 PVRTC 快。
关于 tvOS 的注意事项
Unity 仅支持具有 Metal 支持的 tvOS 设备。该平台上的默认纹理压缩格式是 ASTC。如果手动添加 OpenGL ES 2,请确保将纹理压缩格式更改为 PVRTC 或 ETC,以免在运行时进行纹理解压缩。
关于 Android 的注意事项
常规纹理
除非您的应用程序针对的是特定硬件(例如 Nvidia Tegra 或 Imagination PowerVR),否则必须在几种压缩格式和未压缩格式之间进行选择,这种情况下需要考虑不同的取舍因素:

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。
访问 Android 的 Player Settings(菜单:Edit > Project Settings > Player Settings,然后选择 Android 类别)。
向下滚动到 Graphics APIs 部分。
确保 OpenGL ES 2 不在列表中。
构建 APK(菜单:File > Build Settings,然后单击 Build)。
2.构建一个以 OpenGL ES 2 为目标的单独 APK。
访问 Android Player Settings。
向下滚动到 Graphics APIs 部分。
在列表中添加 OpenGL ES 2 并删除 OpenGL ES 3 和 Vulkan。
构建 APK。
3.将这两个 APK 发布到 Google Play 应用商店。
当用户下载应用程序时,Google Play 应用商店会自动为其设备安装最相关的 APK。
有关发布多个 APK 文件的更多信息,请参阅 Android 开发者文档中的以下主题:
发布多个 APK
Google Play 应用商店 APK 过滤。