我有一个包含一堆对象的场景,例如我们说它是一个简单的图块网格。所以有一个主“边框”对象,然后是(行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);
}
}
答案 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并插入退化三角形来分离模型。
干杯,阿尔特。