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

为OBJ模型添加纹理失败,遇THREE.WebGLRenderer非2次幂图片报错求助

解决Three.js中OBJ模型纹理非2的幂次警告问题

嘿,我懂你遇到的这个头疼问题!那个THREE.WebGLRenderer: image is not power of two警告本质上是因为Three.js默认对非2的幂次(比如284x177这种不是2^n的尺寸)的纹理会自动缩放,目的是兼容一些旧的WebGL硬件,但这往往会导致纹理变形或者不是你想要的显示效果。下面给你两个靠谱的解决方案:

方案1:配置纹理允许非2的幂次显示

如果不想修改图片尺寸,可以直接调整纹理的参数,让Three.js不再自动缩放它。只需要在纹理加载完成后设置几个关键属性就行:

var textureLoader = new THREE.TextureLoader();
var map = textureLoader.load('img/3.jpg', function(texture) {
    // 禁止纹理重复(非2幂次纹理不支持重复平铺)
    texture.wrapS = THREE.ClampToEdgeWrapping;
    texture.wrapT = THREE.ClampToEdgeWrapping;
    // 使用线性过滤替代默认的mipmap过滤(mipmap只支持2幂次纹理)
    texture.minFilter = THREE.LinearFilter;
    // 告诉Three.js更新纹理设置
    texture.needsUpdate = true;
});

var material = new THREE.MeshPhysicalMaterial({map: map});

var loader = new THREE.OBJLoader(loadingManager);
loader.load('models/cool.obj', function(object) {
    object.traverse(function(child) {
        // 确保只给网格对象应用材质
        if (child.isMesh) {
            child.material = material;
        }
    });
    // 别忘了把模型添加到场景里
    scene.add(object);
});

这里要注意:非2幂次的纹理不支持重复平铺(也就是RepeatWrapping模式),如果你的需求是要纹理平铺,那这个方案就不适用,得用下面的方案2。

方案2:将图片修改为2的幂次尺寸

这是最稳妥的方案,完全符合WebGL的传统要求,也不会有任何警告。你可以用Photoshop、GIMP或者在线图片编辑工具,把284x177的图片调整为最近的2的幂次尺寸,比如256x256或者512x256(如果不想让图片拉伸太厉害,也可以在调整尺寸时添加透明边距保持原图比例)。修改完图片后,直接用原来的代码就能正常显示纹理,不需要额外配置。

两种方案按需选就行,如果追求兼容所有设备或者需要纹理平铺,选方案2;如果不想改图且不需要平铺,选方案1就搞定啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:15:02