GLB 纹理压缩:KTX2 与 WebP

纹理转换处理的是 GLB 内嵌的图片。选择 KTX2 或 WebP 后,才能调整质量、缩放比例和最大尺寸。比较时先不要改三角面保留比例,这样更容易看出纹理设置本身的影响。

先确认查看器支持哪种格式

纹理输出用途与加载要求
原始格式保留现有编码,适合作为对照。
WebP使用 EXT_texture_webp,需要目标查看器支持。
KTX2 / ETC1S体积通常较小的 Basis Universal 编码,需要支持 KHR_texture_basisu。
KTX2 / UASTC通常能保留更多纹理细节,但文件更大,加载方式仍走 KTX2。

尺寸和编码质量分别调整什么

纹理缩放设为 50% 时,宽和高各减半,生成 mipmap 前的像素数变为四分之一。最大尺寸也会限制输出尺寸。编码质量调整的是编码器,不是图片分辨率,因此 WebP 的质量 8 与 ETC1S、UASTC 的质量 8 不能直接等同。

缩小后重点检查文字、透明边缘和细小的表面纹理。法线贴图尤其需要注意,数值变化可能影响明暗效果。请用实际项目的灯光和缩放距离检查。

同一张 1024 × 1024 纹理的对比

编码与尺寸GLB 大小(字节)
原始 PNG,1024 × 10242,914,152
WebP, 1024 × 1024445,632
ETC1S, 1024 × 1024258,488
UASTC, 1024 × 10241,373,516
WebP, 512 × 512118,088

样本为本站 CC0 波纹网格,配一张生成的渐变噪声 PNG,由原生 gltfpack 1.3 编码。各行都使用 Meshopt,三角面均为 8,192;需要转码的行使用质量 8。表中记录整个 GLB 的体积,不是单独的纹理体积,也不代表画质或显存占用排名。

在同一处表面比较纹理

以下近景使用同一网格、相机、灯光和材质设置,由 Three.js 0.180.0 渲染表中的实际文件。生成纹理包含渐变和细小噪点,适合观察这些细节,但不能代表文字、透明边缘或法线贴图。

波纹网格上原始 PNG 纹理的近景
原始 PNG · 1024 × 1024
同一表面使用 ETC1S 纹理压缩后的近景
ETC1S · 1024 × 1024
同一表面使用 UASTC 纹理压缩后的近景
UASTC · 1024 × 1024
同一表面使用尺寸减半的 WebP 纹理后的近景
WebP · 512 × 512

在这组截图中,ETC1S 把粉色表面的一部分细小噪点变平滑了,UASTC 则保留了更多颗粒感。尺寸减半的 WebP 中,细碎变化的模糊更明显。结合上面的文件大小表看,保留这些细节在不同编码下需要付出不同的体积代价。

点击图片按原尺寸比较细小色彩变化和表面细节。页面中的缩略图会被缩小,可能掩盖差异。截图来自同一浏览器和 GPU,只作为外观参考,不是画质评分,也不保证所有设备的渲染完全相同。

示例:尺寸减半并输出 WebP

gltfpack -i input.glb -o output.glb -cc -tw -tq 8 -tj 1 -ts 0.5 -kn -km -ke

在界面中选择“更小文件”和 WebP,展开高级设置,将纹理缩放比例设为 50%。如果没有额外的像素上限要求,最大纹理尺寸保持不变。使用前请在目标查看器中重新打开结果。

在 Three.js 中配置 KTX2 和 Meshopt 加载 →

引擎参考: gltfpack

打开优化工具 ↗