You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ThreeJS KTX2Loader加载纹理报uploadTexture不支持格式错误如何解决

问题原因分析
  • KTX2是容器格式,你查到的格式值36492对应容器内封装的BC7压缩纹理格式,该格式仅支持NVIDIA GTX 10系及以上、AMD RX 500系及以上、英特尔Iris Xe核显及以上的GPU。你的设备GPU不支持该格式是触发第一条报错的核心原因,同事设备GPU符合要求所以运行正常。
  • KTX2Loader初始化配置缺失:你当前仅调用了detectSupport方法,没有配置wasm转码路径,当硬件不支持对应压缩格式时,KTX2Loader无法自动转码为通用兼容的RGBA格式,导致纹理上传到WebGL时格式不匹配,触发第二条报错。
  • 第三条报错属于前两个问题的连锁反应:纹理加载失败后帧缓冲区绑定的纹理为无效格式,多重采样校验不通过触发警告,最终纹理显示为黑色。
解决步骤
  1. 补充KTX2Loader的转码配置,将ThreeJS官方自带的basis_transcoder.js和basis_transcoder.wasm文件放到项目静态资源目录,初始化时指定转码路径:
// 替换路径为你项目内的实际静态资源存放路径
this.ktx2Loader = new KTX2Loader(this.manager)
  .setTranscoderPath('/static/basis/')
  .detectSupport(editor.renderer.renderer);
  1. 纹理加载后添加格式校验兜底逻辑:
const texture = await loadTexture(textureUrl, loader);
const gl = editor.renderer.renderer.getContext();
// 校验当前设备是否支持BC7格式
const isBC7Supported = gl.getExtension('EXT_texture_compression_bptc') != null;
if (!isBC7Supported) {
  // 强制指定为通用RGBA无压缩格式,触发转码生效
  texture.format = THREE.RGBAFormat;
  texture.needsUpdate = true;
}
  1. 如果项目存在批量KTX2资源,建议资源产出时同时打包BC3/ETC1/ASTC等多套压缩格式,加载前先检测当前设备支持的格式再请求对应资源,避免实时转码的性能损耗。

内容的提问来源于stack exchange,提问作者zachThePerson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:48:03