Skip to content

纹理优化

专门处理独立的图片文件(即未嵌入 GLB 的散装贴图),例如:从建模软件单独导出的一批 PNG/JPG 贴图。

这个 Tab 和压缩优化里的"纹理设置"有什么区别?

  • 纹理优化 Tab:处理磁盘上的独立图片文件(.png / .jpg / .webp),输出也是独立图片文件
  • 压缩优化 → 纹理设置:处理 GLB 文件内嵌的纹理,输出仍是 GLB 文件

如果你想压缩 GLB 内嵌的纹理,请前往模型压缩优化 → 纹理设置,不需要用这个 Tab。

使用

  1. 选择图片文件(支持 PNG / JPEG / WebP)或文件夹(批量处理)
  2. 选择输出格式:JPEG(兼容)/ WebP(小约 30%)/ KTX2(GPU 原生)
  3. 设置最大边长(超过则等比缩放,推荐 2048;不限制则留空)
  4. 点击"开始优化"

输出默认保存在原文件旁,文件名加 _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 = true

KTX2 不支持 Babylon.js 和 model-viewer

KTX2 纹理格式(KHR_texture_basisu 扩展)目前仅 Three.js 有完整支持。如果你的项目使用 Babylon.js 或 model-viewer,请选择 JPEG 或 WebP 格式。

专为 Web3D 开发者设计