
KTX2 纹理压缩

纹理在现代图形应用中无处不在,它们为模型提供颜色和材质信息。
纹理分辨率越高,我们能获得的细节就越多。如今,高分辨率相机变得越来越普及且价格亲民,但这需要付出代价:内存占用。
我们有 JPEG 和 PNG 等压缩图像格式,可以减少图像存储在磁盘上的空间占用。这些格式对 Web 应用也很有帮助,因为我们可以减少需要通过网络传输的数据量,从而有效缩短页面加载时间。然而,像 JPEG 这样的格式无法被显卡(GPU)直接解析;它们仅用于压缩图像,而非用于渲染。JPEG 图像在发送到 GPU 进行渲染之前需要先解压缩。
以下是一张 256×256 的图像。

使用 GIMP 创建
以高质量压缩为 JPEG 后,大小为 53.5 KB。
一旦我们将图像解压缩为 RGBA8 供 GPU 使用,它将占用 256KB。大约是原来的 5 倍!
这是一张非常小的图像,但举例来说,一张 4K 图像(如今非常常见)将占用 64MB。大型应用会拥有大量资源,包括纹理,因此这会迅速累积并耗尽所有 GPU 内存(VRAM),尤其是在智能手机、平板电脑和 VR 设备等低端设备上。
纹理压缩格式的诞生是为了让图像在 GPU 中保持压缩状态。这些压缩格式专为契合 GPU 架构而设计,以实现最佳性能。这不仅意味着更低的显存(VRAM)占用,还能带来:
- 更快的加载时间,因为需要传输到 GPU 的数据量更少。
- 更高的帧率,因为内部传输带宽需求降低。
不同的 GPU 制造商与主要相关方合作,提出了不同的纹理压缩格式。这些格式的一些示例包括:
- BC 系列格式(也称为 S3TC),如 BC1、BC3、BC6H、BC7(及其他)。这些格式是桌面平台独有的。
- ETC(Ericsson 纹理压缩)系列,由 ETC1、ETC2 以及 ETC2_EAC 和 EAC 组成。这些格式主要被 OpenGL 采用,用于 Android 和 WebGL 平台。
- PVRTC 是 PowerVR 芯片独有的格式系列。它曾很重要,因为它是 iOS 中唯一支持的格式。随着 Apple 现在在所有设备上采用 ASTC,它正逐渐被淘汰。
- ASTC 是当今最先进的纹理压缩格式。它是由 Khronos 组织开发的标准,现在是移动设备的事实标准格式。
可以想象,对于关心在多平台上获得良好性能的应用开发者来说,拥有如此多的纹理压缩格式可能是一个巨大的难题。
Khronos 组织试图通过 KTX2 容器格式和超级压缩方案来解决这种碎片化问题。我们将在后续章节中进一步探讨它们。
KTX1
在 KTX2 之前,正如你可能猜到的,有 KTX1。
KTX1 是一种非常简单的图像容器格式——也就是说,它只是一种包含图像的格式,这些图像可以是不同的格式。它可以包含上述任何压缩纹理格式,也可以包含原始的 RGBA 图像。它很简单,就是好用。
问题在于,如果你想支持许多平台,KTX1 容器必须包含针对每个平台的特定格式的图像。这可能难以维护,并且意味着要以每种格式存储相同的信息(文件变得更大)。
KTX2
KTX2 旨在通过可转码格式和超级压缩方案进一步解决碎片化问题。
除了 KTX1 支持的图像格式外,KTX2 还增加了两种可转码格式:通用 ASTC(UASTC)和 ETC1S。这些格式旨在转换为平台特定的纹理压缩格式。从这些所谓的可转码格式到纹理压缩格式的转换速度极快,因此可以轻松地在运行时执行(此过程称为转码)。
除此之外,KTX2 还增加了对超级压缩方案的支持。这是一种在磁盘上进一步压缩可转码格式的技术。借助这些技术,我们可以获得大小与 JPEG 相似,有时甚至更小的 KTX2 文件。

[图片来自 https://www.khronos.org/ktx/]
如何将图像转换为 KTX
为了将图像转换为 KTX,你可以使用官方的 KTX-Software 命令行工具。
您可以从源代码编译命令行工具,但最简单的选择是从Releases部分下载安装程序。
在安装过程中,请确保勾选“Command line tools”复选框。

在安装文件夹内,您会找到所需的工具:toktx.exe。
基本命令:
| toktx.exe –encode uastc –zcmp 15 –genmipmap output.ktx input.jpg |
–zcmp:配置磁盘上的压缩级别。
–genmipmap:将生成完整的mipmap链并存储在KTX文件中。建议使用此选项,因为生成压缩纹理的mipmap链开销很大,应避免在运行时进行。
另一个有趣的选项是–uastc_quality,它允许您精细调整质量与压缩速度之间的平衡。
| toktx.exe –encode uastc –zcmp 15 –genmipmap –uastc_quality 3 output.ktx input.jpg |
toktx有许多选项,您绝对应该了解一下:
| toktx.exe –help |
基准测试
作为一个简单示例,我们使用一个带有PBR材质的简单球体。
我们创建了两个相同的材质,区别仅在于一个使用JPG图像,另一个使用KTX图像。

如您所见,使用KTX可大幅减少VRAM用量。使用JPG时,全部4张图像总计占用128MB VRAM,而使用KTX时仅占用32MB。最终图像质量相似,您不会注意到差异。
此外,对于大多数图像,KTX占用的磁盘空间似乎比JPG更少,尽管并非总是如此。
在此测试中,我们使用官方的“toktx”命令行工具将JPG图像转换为KTX。为该命令行工具找到最佳参数组合是一门艺术,因为它涉及权衡取舍。您应尝试为应用程序的图像找到最合适的参数,同时考虑质量/性能需求。例如,法线贴图通常比颜色贴图要求更高的精度。
以下是我们在前一个示例中使用的参数:
| 颜色: & 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf srgb –target_type RGB –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_color.ktx .\Jpg\Bricks_color.jpg
法线: & 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type RGB –normalize –uastc_quality 3 –uastc_rdo_l 0.5 –zcmp 20 .\Ktx\Bricks_normals.ktx .\Jpg\Bricks_normals.jpg
PBR: & 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type RG –uastc_quality 3 –uastc_rdo_l 1 –zcmp 20 .\Ktx\Bricks_pbr.ktx .\Jpg\Bricks_pbr.jpg
AO: & 'C:\Program Files\KTX-Software\bin\toktx.exe' –encode uastc –genmipmap –assign_oetf linear –target_type R –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_AO.ktx .\Jpg\Bricks_AO.jpg |
Evergine中的KTX
我们在Evergine 2025.10中增加了对KTX1和KTX2以及所有平台特定压缩纹理格式的支持。
这对所有应用程序都是好消息,尤其是对Web应用程序,因为采用它可以大幅缩短加载时间。
您现在可以以最小的投入优化您的图形应用程序:一切都无缝集成到引擎中,并且非常用户友好。
用户可以在编辑器中像导入其他图像格式一样导入KTX2文件,并将其用于材质。文件扩展名需为“.ktx”或“.ktx2”。
Evergine.ImageRuntime已扩展,支持加载KTX2文件。
如果您的GLTF文件包含KTX图像(嵌入或引用),一切将开箱即用。
