我一直在try 将一个Uint32Array
的缓冲区指向一个uint
的输入变量.
我可以在网上找到的所有信息都说这应该是可能的,但无论我做什么,我都会得到同样的错误:
[.WebGL-0x62401b7e200] GL_INVALID_OPERATION: Vertex shader input type does not match the type of the bound vertex attribute.
下面是我的顶点着色器:
#version 300 es
in vec4 a_ipos;
in uint a_cdata;
uniform vec2 ures;
void main() {
uint x = a_cdata & 0x7C00u;
uint y = a_cdata & 0x03E0u;
uint z = a_cdata & 0x001Fu;
vec4 pos = a_ipos + vec4(float(x), float(y), float(z), 1.);
gl_Position = vec4(pos.x * ures.y / ures.x, pos.yzw);
}
下面是我对webgl的调用,将缓冲区指向属性:
gl.bindBuffer(gl.ARRAY_BUFFER, chunkBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Uint32Array(chunkData), gl.STATIC_DRAW);
gl.enableVertexAttribArray(cdataloc);
gl.vertexAttribPointer(
cdataloc,
1,
gl.UNSIGNED_INT,
false,
0,
0
);
第gl.UNSIGNED_INT
章和第uint
章不一样
然而,GLSL 300 ES reference card表示它是一个32位无符号整数.
MDN同意gl.UNSIGNED_INT
是32位无符号整数.
我不知道我做错了什么.我试着用gl.INT
和in int ...
,还是什么都没有.将整数的精度更改为highp
也不会改变任何东西.(假设highp
将整数转换为32位,这似乎不是这样).
将类型更改为浮动确实有效.但我使用的任何其他类型的手机都不会.
我也试着用了gl.SHORT
.这是为了抛弃glsl中的int
类型可能是16位整数的理论.还是同样的错误.
This question:WebGL:如何在GLSL中使用DDL属性
这解决不了我的问题因为答案提供的文件已经过时.GLSL 1.00 ES不允许按照specification在属性中使用整数.
然而,GLSL 3.00 ES specification似乎并不在乎,只要类型不是以下类型之一:boolean
,opaque
,array
,struct
.