纹理优化
专门处理独立的图片文件(即未嵌入 GLB 的散装贴图),例如:从建模软件单独导出的一批 PNG/JPG 贴图。
这个 Tab 和压缩优化里的"纹理设置"有什么区别?
- 纹理优化 Tab:处理磁盘上的独立图片文件(
.png/.jpg/.webp),输出也是独立图片文件 - 压缩优化 → 纹理设置:处理 GLB 文件内嵌的纹理,输出仍是 GLB 文件
如果你想压缩 GLB 内嵌的纹理,请前往模型压缩优化 → 纹理设置,不需要用这个 Tab。
使用
- 选择图片文件(支持 PNG / JPEG / WebP)或文件夹(批量处理)
- 选择输出格式:JPEG(兼容)/ WebP(小约 30%)/ KTX2(GPU 原生)
- 设置最大边长(超过则等比缩放,推荐 2048;不限制则留空)
- 点击"开始优化"
输出默认保存在原文件旁,文件名加 _optimized 后缀;KTX2 格式输出为 {原名}_ktx2.ktx2。
KTX2 参数
| 参数 | 说明 |
|---|---|
| 压缩模式 | ETC1S(小体积,有损)/ UASTC(高质量,接近无损) |
| 质量 | ETC1S 下 1–255,推荐 96(偏小体积)或 128(平衡);数值越高质量越好体积越大 |
| Mipmap 链 | 关闭可减小约 33% 体积;关闭后在 Three.js 中需手动设置 generateMipmaps: false |
怎么选模式?
颜色贴图(albedo / diffuse)用 ETC1S,体积更小。法线贴图、高光贴图等细节纹理用 UASTC,精度更高。
Mipmap 关闭后需同步修改加载代码
关闭 Mipmap 后,Three.js 默认会尝试生成 Mipmap,但 KTX2 纹理不允许动态生成,会导致渲染警告或显示异常。需要在加载后手动指定:
js
texture.generateMipmaps = false
texture.minFilter = THREE.LinearFilter // 或 NearestFilter在 Three.js 中加载 KTX2
前提条件
KTX2 是 GPU 原生格式,Three.js 需要额外配置解码器(Basis Universal Transcoder)才能加载。这不是 Zipoly 的问题,而是所有 KTX2 工具链的通用要求。
js
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 格式。