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

Three.js绘制交错顶点四边形报错:'tex'不是WebGLTexture

问题:Three.js绘制四边形时提示“'tex'不是WebGLTexture”

我尝试在Three.js中绘制交错顶点的四边形,但程序持续报错提示“'tex'不是WebGLTexture”,无法运行。相关代码如下:

// z= depth, tex is texture
function drawQuad(z, tex)
{
  var verts = [      
    -1.0,  1.0, z, 0.0, 1.0,
    -1.0, -1.0, z, 0.0, 0.0,
    1.0,  1.0, z, 1.0, 1.0,
    1.0, -1.0, z, 1.0, 0.0,      
  ];    

  const gl = renderer.getContext();  

  gl.disable(gl.DEPTH_TEST);

  gl.useProgram(quadShader);

  var vb = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vb);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW);    

  gl.bindBuffer(gl.ARRAY_BUFFER, vb);

  gl.enableVertexAttribArray(0);  
  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 20, 0);

  gl.enableVertexAttribArray(1);  
  gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 20, 12);  

  gl.uniform1i(gl.getUniformLocation(quadShader, 'su_tex'), 0)
  gl.activeTexture(gl.TEXTURE0 + 0);     
  gl.bindTexture(gl.TEXTURE_2D, tex);   

  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) 
  
  gl.enable(gl.DEPTH_TEST);
}

纹理加载代码:

wallTex = loader.load("https://r105.threejsfundamentals.org/threejs/resources/images/wall.jpg");
drawQuad(1.0, wallTex);

原因与解决方案
  • 纹理加载未完成就传入底层API
    Three.js的loader.load()是异步方法,调用后立刻返回的THREE.Texture对象只是一个空壳,内部的原生WebGLTexture还没初始化完成。直接把这个对象传给gl.bindTexture(),自然会因为不是有效WebGLTexture实例而报错。

  • 混淆了Three.js纹理与原生WebGLTexture
    你传入的是Three.js封装的THREE.Texture对象,但gl.bindTexture()需要的是原生WebGLTexture实例——它存储在Three.js纹理对象的webGLTexture属性里,但这个属性只有在纹理加载完成后才会有值。

正确修改方式

方式1:等待纹理加载完成再调用绘制

修改加载代码,利用回调确保纹理就绪:

wallTex = loader.load(
  "https://r105.threejsfundamentals.org/threejs/resources/images/wall.jpg",
  (texture) => {
    // 加载完成后传入原生WebGLTexture
    drawQuad(1.0, texture.webGLTexture);
  }
);

方式2:用Three.js原生组件绘制(更推荐)

既然用了Three.js,没必要直接操作底层WebGL,用官方组件更简洁:

// 创建平面几何体与材质
const planeGeo = new THREE.PlaneBufferGeometry(2, 2);
const planeMat = new THREE.MeshBasicMaterial({ map: wallTex });
const quad = new THREE.Mesh(planeGeo, planeMat);
quad.position.z = 1.0;
scene.add(quad);

// 渲染循环
function render() {
  renderer.render(scene, camera);
  requestAnimationFrame(render);
}
render();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:55:25