我想实现一个带有顶点缓冲区的渲染器,每帧都会在应用程序端更新。此外,顶点的数量(即三角形的数量)也将在每一帧发生变化。
我的方法是预先分配一次所需的最大值作为 Float32Array,然后仅更新更改的值,并使用 bufferSubData 更新缓冲区数据。然后通过从索引缓冲区发送一个范围来绘制我想要的那些。
作为一个最小的例子,假设我已经为 Float32Array 中的 2 个单独的三角形分配了位置顶点,对于这个帧,我只想移动并绘制第二个三角形。我想我会这样做:
arrPos[9] += 1.0; // move the X coordinates in the Float32Array
arrPos[12] += 1.0;
arrPos[15] += 1.0;
gl.bindBuffer(gl.ARRAY_BUFFER, bufPos); // tell GL which buffer to use
gl.bufferSubData( gl.ARRAY_BUFFER, 3 * 3 * 4, arrPos ); // update the vertices - ERROR
// then just draw the 2nd traingle by sending its indices only
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufId); // tell GL which buffer to use
gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 3 * 2); // draw just this range
问题是,bufferSubData 抛出错误:“GL ERROR :GL_INVALID_VALUE : glBufferSubData: out of range”
我已经尝试过使用 bufferSubData 的偏移量 3、9、12 来解决这个问题,但它们都给了我同样的错误。
另一方面:如果我能得到这个工作,在我看来,如果我想在重新使用这个预先分配的 Float32Array 的同时每帧绘制可变数量的三角形,我需要更新 END 的值数组,而不是开始,因为我只能指定偏移量,而不是开始索引,到 bufferSubData。我希望有人能告诉我这种方法是否可行,或者我是否完全偏离了轨道,应该停止浪费我的时间。