在Android上使用opengl-es,我应该将所有glVertexPointer数据放入一个缓冲区吗?

时间:2010-09-13 15:19:59

标签: android opengl-es

我有一个包含一堆对象的场景,例如我们说它是一个简单的图块网格。所以有一个主“边框”对象,然后是(行x列)单元格。

为简单起见,假设每个单元格是一个简单的四段线,由四节点GL_LINE_LOOP组成。

目前,我的帧速率非常高,而且它似乎位于我正在进行的所有glVertexBuffer()调用中,因为每个单元都有自己的顶点集,所以它自己调用glVertexPointer:

class MyModel extends Model {
  ...
  public void onDrawFrame(GL10 gl) {
    gl.glVertexPointer(0, GL10.GL_FLOAT, 0, mBuffer);
    gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4);
  }

}

我是否应该在世界超级对象中跟踪所有不同的原始模型,并保留内存中所有顶点的副本?然后我可以在每个帧的开头执行一个glVertexPointer调用,并使用DrawArrays的偏移量。

class MyModel extends Model {

  public MyModel() {
    // do something clever in parent Model class to track total verts
    this.offsetId = somethingFromSuper();
  }

  public void onDrawFrame(GL10 gl) {
    // super's vertices should all have been already sent to GL
    gl.glDrawArrays(GL10.GL_LINE_LOOP, this.offsetId, 4);
  }

}

1 个答案:

答案 0 :(得分:1)

我认为这不会产生很大的不同:你仍在为每个模型调用单独的gl draw命令。相反,您可能希望让“世界”类将图形处理,将所有模型顶点组合成一个大数组,并通过一次调用绘制它。除了遍历模型以获取它们的顶点信息并构造“世界”数组,而不是在每个模型上调用绘图时,它几乎是相同的。

根据高通公司的这篇文章(有点旧,但可能仍然相关),如果渲染命令绘制的顶点少于30个顶点,这种方法是绝对必要的:http://www.cin.ufpe.br/~mact/graduacao/so/dia1/progpc21_dorbie_3dgraphics.pdf

在这种情况下,您将无法使用GL_LINE_LOOP,但需要使用GL_LINES。如果要绘制tris,可以使用GL_TRIANGLES或GL_TRIANGLE_STRIP并插入退化三角形来分离模型。

干杯,阿尔特。