WebGL 2.0中Uint32Array绑定uint输入变量报错求助
解决方案:使用
vertexAttribIPointer传递整数顶点属性 你遇到的问题核心是错误使用了顶点属性绑定方法:gl.vertexAttribPointer会将所有输入数据转换为浮点类型——哪怕你指定了gl.UNSIGNED_INT,它也会把32位无符号整数转成对应浮点值,而你的顶点着色器期望的是原生uint整数输入,自然触发类型不匹配错误。
WebGL2专门提供了**gl.vertexAttribIPointer**(末尾的I代表Integer)来处理整数类型的顶点属性,它会直接传递整数数据,不会进行浮点转换,完美匹配着色器中的uint输入。
修改你的绑定代码,把gl.vertexAttribPointer替换成gl.vertexAttribIPointer即可:
gl.bindBuffer(gl.ARRAY_BUFFER, chunkBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Uint32Array(chunkData), gl.STATIC_DRAW); gl.enableVertexAttribArray(cdataloc); // 替换为vertexAttribIPointer,注意normalized参数需传0(该参数对整数属性无效) gl.vertexAttribIPointer( cdataloc, 1, gl.UNSIGNED_INT, 0, 0, 0 );
补充说明
- 你之前尝试改用
int+gl.INT也无效,原因和上面一致:用vertexAttribPointer还是会把整数转成浮点,和着色器的int输入不匹配,换成vertexAttribIPointer同样能解决这个场景的问题。 - 改成
float能运行,是因为vertexAttribPointer把整数转成浮点后,正好匹配着色器的float输入类型,但这不是你想要的原生整数处理方式。
内容的提问来源于stack exchange,提问作者Carlo Augusto Bagnoli Gomez
相关产品推荐
相关产品推荐

