1

为了加快 WebGL 中许多几乎相同对象的显示速度,我尝试(天真地,我猜)重用缓冲区内容。在每个对象的绘图例程中,我有(有些简化):

if (! dataBuffered) {
  dataBuffered = true;
  :
  : gl stuff here: texture loading, buffer binding and filling
  :
}
// set projection and model-view matrices
gl.uniformMatrix4fv (shaderProgram.uPMatrix, false, pMatrix);
gl.uniformMatrix4fv (shaderProgram.uMVMatrix, false, mvMatrix);
// draw rectangle filled with texture
gl.drawArrays(gl.TRIANGLE_STRIP, 0, starVertexPositionBuffer.numItems);

我的想法是纹理、顶点和纹理坐标缓冲区是相同的,但是模型视图矩阵会发生变化(不同位置的相同对象)。但是,唉,什么都没有出现。当我评论 时dataBuffered = true,它是可见的。

所以我的问题是,是否drawArray()丢弃或清空缓冲区?还有什么事情发生?(如果这很重要,我正在学习 learningwebgl.com上的课程。)

4

1 回答 1

1

简短的回答是,是的,您可以重用您为多个 gl.drawArrays() 设置的所有状态。

http://omino.com/experiments/webgl/simplestWebGlReuseBuffers.html是一个小例子,它只是改变一个统一的浮点数(Y 比例)并重绘,每个刻度两次。

(在这种情况下,没有纹理,但其他一些状态保持粘性。)

希望有帮助!

uniformSetFloat(gl,prog,"scaleY",1.0);
gl.drawArrays(gl.TRIANGLES, 0, posPoints.length / 3);

uniformSetFloat(gl,prog,"scaleY",0.2);
gl.drawArrays(gl.TRIANGLES, 0, posPoints.length / 3);
于 2013-10-17T21:38:03.663 回答