我正在调试一些不熟悉的代码,当它加载KTX2纹理时,我得到以下3:
THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()
WebGL warning: compressedTexSubImage:
格式must match the format of the existing texture image.
WebGL warning: blitFramebuffer: DRAW_FRAMEBUFFER may not have multiple samples.
纹理也加载为黑色,我相信这与警告有关。
我已经设法追踪到这些代码
this.ktx2Loader = new KTX2Loader(this.manager).detectSupport(editor.renderer.renderer);
...
loader = this.ktx2Loader;
const texture = await loadTexture(textureUrl, loader);
...
function loadTexture(src, textureLoader = new TextureLoader()) {
return new Promise((resolve, reject) => {
textureLoader.load(src, resolve, null, error => reject(new RethrownError(`Error loading texture "${src}"`, error)));
});
}
这就是它消失在ThreeJS内部代码的地方,我没有足够的经验知道如何处理。
这些格式正在加载36492
的格式,我认为这是KTX2从我可以告诉,所以我有点不确定是什么导致了错误。更奇怪的是,它可以在一些同事的机器上运行,但不是我自己的。
有谁知道是怎么回事吗?
您尝试加载的压缩格式(36492
或0x8E8C
)是EXT_texture_compression_bptc
,更具体地说是COMPRESSED_RGBA_BPTC_UNORM_EXT
(又名BC7)这是webgl规范
webgl中的任何压缩格式支持都是作为扩展提供的。因此,您不能假设给定的平台/硬件支持任何格式。一般来说,每个操作系统都需要自己的集合。
要在webgl中正确使用压缩纹理,您需要导出各种格式,并根据运行时功能测试加载适当的格式。最后,总是提供一个非压缩的回退文件(jpg, png, webp…)。
注意KTX只是一个容器,而不是压缩格式/编解码器。它可以包含任何格式,AFAIK。