【问题标题】:Does webgl drawArray() empty/discard the buffers?webgl drawArray() 是否清空/丢弃缓冲区?
【发布时间】:2013-10-18 05:38:03
【问题描述】:

为了加快 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 学习课程。)

【问题讨论】:

  • 您需要在某处发布更多代码或工作示例(jsfiddle?)。不,drawArrays 不会丢弃或清空任何缓冲区。

标签: performance webgl render


【解决方案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);

【讨论】:

  • 感谢您的保证 - 那里出现另一个错误,导致无法显示任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多