我在WebGL中创建了一个小应用程序,我有两个移动的对象,一个立方体和一个球体。
我用着色器修改对象,每个对象都有着色器。所以我想在确定的时间在显示器上更新对象,为此我使用drawElements
函数。
对于每个对象,我有一个缓冲区,其中包含顶点缓冲区中面的索引:
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STREAM_DRAW);
indexCount = indices.length;
indices是一个包含每个面的索引值的数组。 (每个面3个值,我们使用三角形)。
所以,在此之后,对于我所做的对象的绘制三角形:
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.drawElements(gl.TRIANGLES, indexCount, gl.UNSIGNED_SHORT, 0);
但我屏幕上什么都没有,我有这个警告:
WebGL:INVALID_OPERATION:drawElements:attribs设置不正确
我的错误是什么?
由于
答案 0 :(得分:2)
我认为你错过了在drawElements()之前将javascript顶点缓冲区链接到着色器属性的代码。
e.g:
gl.bindBuffer(gl.ARRAY_BUFFER, meshVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,
meshVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, meshIndexBuffer);
gl.drawElements(gl.TRIANGLES, meshIndexBuffer.numberOfItems, gl.UNSIGNED_SHORT, 0);