Skip to content

最后更新:

纹理优化 ​

纹理优化用于压缩独立的图片文件(即未嵌入 GLB 的散装贴图):把 PNG/JPEG/WebP 批量转成 KTX2(GPU 原生,Basis Universal ETC1S/UASTC)、WebP 或 JPEG,并可等比缩放分辨率。例如从建模软件单独导出的一批 PNG/JPG 贴图。

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

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

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

使用 ​

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

输出默认保存在原文件旁,文件名加 _optimized 后缀;KTX2 格式输出为 {原名}_ktx2.ktx2。

输出格式怎么选 ​

输出格式体积质量兼容性适用
保持原格式—无损—只想缩放分辨率,不改格式
KTX2最小ETC1S 有损 / UASTC 近无损仅 Three.jsThree.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 纹理不允许动态生成,会导致渲染警告或显示异常。需要在加载后手动指定:

js
texture.generateMipmaps = false
texture.minFilter = THREE.LinearFilter  // 或 NearestFilter

在 Three.js 中加载 KTX2 ​

前提条件

KTX2 是 GPU 原生格式,浏览器不能直接解码,Three.js 需额外配置转码器(Basis Universal Transcoder)——这是所有 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 格式。

常见问题 ​

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,代码见上文警告块。

参考与延伸阅读 ​

专为 Web3D 开发者设计