纹理优化
纹理优化用于压缩独立的图片文件(即未嵌入 GLB 的散装贴图):把 PNG/JPEG/WebP 批量转成 KTX2(GPU 原生,Basis Universal ETC1S/UASTC)、WebP 或 JPEG,并可等比缩放分辨率。例如从建模软件单独导出的一批 PNG/JPG 贴图。
这个 Tab 和压缩优化里的"纹理设置"有什么区别?
- 纹理优化 Tab:处理磁盘上的独立图片文件(
.png/.jpg/.webp),输出也是独立图片文件 - 压缩优化 → 纹理设置:处理 GLB 文件内嵌的纹理,输出仍是 GLB 文件
如果你想压缩 GLB 内嵌的纹理,请前往模型压缩优化 → 纹理设置,不需要用这个 Tab。
使用
- 选择图片文件(支持 PNG / JPEG / WebP),可一次多选批量处理
- 选择输出格式:保持原格式 / JPEG(兼容)/ PNG / WebP(小约 30%)/ KTX2(GPU 原生)
- 设置最大边长(超过则等比缩放,推荐 2048;不限制则留空)
- 点击"开始优化"

输出默认保存在原文件旁,文件名加 _optimized 后缀;KTX2 格式输出为 {原名}_ktx2.ktx2。
输出格式怎么选
| 输出格式 | 体积 | 质量 | 兼容性 | 适用 |
|---|---|---|---|---|
| 保持原格式 | — | 无损 | — | 只想缩放分辨率,不改格式 |
| KTX2 | 最小 | ETC1S 有损 / UASTC 近无损 | 仅 Three.js | Three.js 项目追求极致加载性能 |
| WebP | 小约 30% | 有损 | 主流浏览器 | 通用网页,平衡体积与兼容 |
| JPEG | 中 | 有损 | 几乎全部环境 | 最大兼容(Babylon.js / model-viewer 等) |
| PNG | 最大 | 无损 | 几乎全部环境 | 需要透明通道 / 无损存档 |
KTX2 参数
| 参数 | 说明 |
|---|---|
| 压缩模式 | ETC1S(小体积,有损)/ UASTC(高质量,接近无损) |
| 质量 | 本页 ETC1S 固定为平衡值;1–255 可调的质量滑杆在压缩页的「纹理设置」弹窗中 |
| Mipmap 链 | 关闭可减小约 33% 体积(关闭后需同步修改加载代码,见下方说明) |
怎么选模式?
颜色贴图(albedo / diffuse)用 ETC1S,体积更小。法线贴图、高光贴图等细节纹理用 UASTC,精度更高。
Mipmap 关闭后需同步修改加载代码
关闭 Mipmap 后,Three.js 默认会尝试生成 Mipmap,但 KTX2 纹理不允许动态生成,会导致渲染警告或显示异常。需要在加载后手动指定:
texture.generateMipmaps = false
texture.minFilter = THREE.LinearFilter // 或 NearestFilter在 Three.js 中加载 KTX2
前提条件
KTX2 是 GPU 原生格式,浏览器不能直接解码,Three.js 需额外配置转码器(Basis Universal Transcoder)——这是所有 KTX2 工具链的通用要求。
import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
// renderer 是你的 THREE.WebGLRenderer 实例
const ktx2Loader = new KTX2Loader()
// 推荐:将转码器复制到项目 public 目录(避免依赖外部 CDN)
// cp node_modules/three/examples/jsm/libs/basis public/basis -r
ktx2Loader.setTranscoderPath('/basis/')
ktx2Loader.detectSupport(renderer) // 根据 GPU 能力选择最优子格式
// 加载含 KTX2 纹理的 GLB
const loader = new GLTFLoader()
loader.setKTX2Loader(ktx2Loader)
loader.load('model.glb', gltf => scene.add(gltf.scene))
// 单独加载 KTX2 文件(非 GLB)
const texture = await ktx2Loader.loadAsync('texture_ktx2.ktx2')
material.map = texture
material.needsUpdate = trueKTX2 不支持 Babylon.js 和 model-viewer
KTX2 纹理格式(KHR_texture_basisu 扩展)目前仅 Three.js 有完整支持。如果你的项目使用 Babylon.js 或 model-viewer,请选择 JPEG 或 WebP 格式。
常见问题
KTX2 有必要吗,还是转 WebP 就够?
看目标环境:Three.js 项目追求极致加载性能选 KTX2(GPU 原生解码,不耗 CPU);项目要兼容 Babylon.js / model-viewer,或不想配置 KTX2Loader,选 WebP(体积小约 30%,兼容性好)。
ETC1S 和 UASTC 怎么选?
颜色贴图(albedo / diffuse)用 ETC1S,体积更小;法线、高光等细节纹理用 UASTC,质量接近无损但体积更大。
纹理优化和压缩页的「纹理设置」用哪个?
处理散装图片文件用本页;压缩 GLB 时处理其内嵌纹理,用模型压缩优化 → 纹理设置。
关了 Mipmap 后纹理显示异常?
KTX2 纹理不允许 Three.js 动态生成 Mipmap,需在加载后手动设置 texture.generateMipmaps = false 并将 minFilter 改为 THREE.LinearFilter,代码见上文警告块。
参考与延伸阅读
- KHR_texture_basisu 扩展规范(Khronos 官方,KTX2 在 glTF 中的定义)
- BinomialHZ/basis_universal — Basis Universal / KTX2 编码器开源实现
- KTX2Loader 文档 — three.js 中加载 KTX2 的转码器配置