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 × 1024 | 2,914,152 |
| WebP, 1024 × 1024 | 445,632 |
| ETC1S, 1024 × 1024 | 258,488 |
| UASTC, 1024 × 1024 | 1,373,516 |
| WebP, 512 × 512 | 118,088 |
样本为本站 CC0 波纹网格,配一张生成的渐变噪声 PNG,由原生 gltfpack 1.3 编码。各行都使用 Meshopt,三角面均为 8,192;需要转码的行使用质量 8。表中记录整个 GLB 的体积,不是单独的纹理体积,也不代表画质或显存占用排名。
在同一处表面比较纹理
以下近景使用同一网格、相机、灯光和材质设置,由 Three.js 0.180.0 渲染表中的实际文件。生成纹理包含渐变和细小噪点,适合观察这些细节,但不能代表文字、透明边缘或法线贴图。
在这组截图中,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
打开优化工具 ↗


