Javascript 错误:WebGL警告:VertexAttribute指针:-1不是有效的`索引`

Javascript 错误:WebGL警告:VertexAttribute指针:-1不是有效的`索引`,javascript,glsl,webgl,Javascript,Glsl,Webgl,最近我遇到了一个非常奇怪的错误。在顶点着色器中,我有三个属性: attribute vec3 vPosition; attribute vec3 vNormal; attribute vec3 vColor; 我以相同的方式初始化与它们关联的缓冲区,一切看起来都很好。然而,在我的渲染周期中,当我将属性绑定到缓冲区时,第一个和第三个属性工作正常,而第二个属性给了我一个奇怪的错误。这让我很恼火,因为我对所有3个属性都使用相同的代码 这是我的绑定代码: gl.bindBuffer(gl.ARRAY_

最近我遇到了一个非常奇怪的错误。在顶点着色器中,我有三个属性:

attribute vec3 vPosition;
attribute vec3 vNormal;
attribute vec3 vColor;
我以相同的方式初始化与它们关联的缓冲区,一切看起来都很好。然而,在我的渲染周期中,当我将属性绑定到缓冲区时,第一个和第三个属性工作正常,而第二个属性给了我一个奇怪的错误。这让我很恼火,因为我对所有3个属性都使用相同的代码

这是我的绑定代码:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vBuffer);
gl.vertexAttribPointer(gl.getAttribLocation(program, "vPosition"), 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(gl.getAttribLocation(program, "vPosition"));

gl.bindBuffer(gl.ARRAY_BUFFER, this.nBuffer);
gl.vertexAttribPointer(gl.getAttribLocation(program, "vNormal"), 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(gl.getAttribLocation(program, "vNormal"));

gl.bindBuffer(gl.ARRAY_BUFFER, this.cBuffer);
gl.vertexAttribPointer(gl.getAttribLocation(program, "vColor"), 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(gl.getAttribLocation(program, "vColor"));
这是我得到的错误代码(我得到两次,每行调用一次


这似乎表明我在使用
getAttriblLocation
时出错了,但我将着色器中变量的实际名称传递给它,就像我对其他两个变量所做的一样。是否有任何明显的遗漏?如何解决此问题?

getAttriblLocation
获取活动属性的属性索引属性是程序资源

对于指向的点,其中指定了:

如果编译器和链接器确定在执行着色器时可以访问该属性,则通用属性变量被视为处于活动状态。 在顶点着色器中声明但从未使用的属性变量不被视为活动。[…]


这意味着,顶点着色器程序中未“使用”的属性变量不会变为活动状态。因此,当查询变量的索引时,该变量不与属性索引关联,并且
getAttributeLocation
返回-1。

是否存在未“使用”的属性在着色器程序中?不“需要”的属性不会成为活动的程序资源,也不会“获取”属性索引。glsl编译器和链接器可以进行大量优化。似乎是这样。我没有使用vColor。
Error: WebGL warning: vertexAttribPointer: -1 is not a valid `index`. This value probably comes from a getAttribLocation() call, where this return value -1 means that the passed name didn't correspond to an active attribute in the specified program.