WebGL错误 - 错误:WebGL:bindBuffer:缓冲区已包含元素数据

时间:2016-03-31 15:50:00

标签: javascript webgl

我正在尝试使用WebGL绘制一个简单的圆圈,但是我遇到了一些错误。我是编写WebGL代码的新手,如果有人能够向我解释这个问题,我会很高兴。

我可以使用相同的代码创建一个简单的正方形,但有5个顶点,这非常有效。但是当我尝试使用这种方法创建一个数组时,它似乎并不喜欢它。如果这是一个微不足道的错误,我很抱歉,但解释会非常有用。

提前谢谢。

  

错误:WebGL:bindBuffer:buffer已包含元素数据。   webgl-debug.js:232:20错误:WebGL:vertexAttribPointer:无效   元素大小webgl-debug.js:232:20 TypeError:值未定义

这些显示在控制台中。这是我正在使用的代码。

function setupBuffers() {
  //Setup the circle vertices
  circleVertexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, circleVertexBuffer);
  var r = 0.2;
  var centre = 0;
  var circleVertices = [];
  var z = 0;
  theta = 178;
  circleVertices.push(centre);
  circleVertices.push(r);
  circleVertices.push(z);
  for(var i = 0; i<theta; i++){
    var rads2deg = i * (Math.PI/180);
    var x = r * Math.cos(rads2deg);
    var y = r * Math.sin(rads2deg);

    circleVertices.push(x);
    circleVertices.push(y);
    circleVertices.push(z);
  }
  circleVertices.push(centre);
  circleVertices.push(r);
  circleVertices.push(z);
  console.log(circleVertices);

  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(circleVertices), gl.STATIC_DRAW);
  circleVertices.itemSize = 3;
  circleVertices.numberOfItems = circleVertices.length/circleVertices.itemSize;
}

function draw() {
  //set up a viewport that is the same as the canvas using function viewport  (int x, int y, sizei w, sizei h) where x and y give the x and y window coordinates of the viewports width and height.
  gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);

  //fill the canvas with solid colour. Default is black. If other color is desiarible using function gl.clearColor (r,g,b,a)
  gl.clear(gl.COLOR_BUFFER_BIT);

  gl.bindBuffer(gl.ARRAY_BUFFER, circleVertexBuffer);
  gl.vertexAttrib4f(shaderProgram.vertexColorAttribute, 1.0, 1.0, 1.0, 1.0);
  gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, circleVertexBuffer.itemSize, gl.FLOAT, false, 0, 0);
  gl.drawArrays(gl.LINE_STRIP, 0, circleVertexBuffer.numberOfItems);
}

1 个答案:

答案 0 :(得分:2)

问题在于这一行

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, circleVertexBuffer);

WebGL中有两种类型的缓冲区。

  • ELEMENT_ARRAY_BUFFER个缓冲区

    这些缓冲区包含gl.drawElements

  • 的索引
  • ARRAY_BUFFER缓冲区。

    这些缓冲区包含属性数据(位置,法线,texcoords等)

使用gl.createBuffer创建缓冲区时,它还没有缓冲区类型。第一次将该缓冲区与gl.bindBuffer绑定时,它就变成了绑定它的任何类型的缓冲区。如果您将其绑定到ARRAY_BUFFER,它现在是ARRAY_BUFFER缓冲区。如果您将其绑定到ELEMENT_ARRAY_BUFFER,它现在是ELEMENT_ARRAY_BUFFER缓冲区。一旦它出现这些类型之一,您可以更改它的类型或将其用于其他类型。

因此,在您的代码中执行此操作

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, circleVertexBuffer);

这使circleVertexBuffer成为ELEMENT_ARRAY_BUFFER类型的缓冲区。但是在draw你有这个

gl.bindBuffer(gl.ARRAY_BUFFER, circleVertexBuffer);

缓冲区不是两种类型。将setupBuffers中的第一个更改为

gl.bindBuffer(gl.ARRAY_BUFFER, circleVertexBuffer);

您可能会发现此答案很有帮助 https://stackoverflow.com/a/27164577/128511