0

我正在开发一个游戏,在屏幕上呈现类似的对象。问题是每次添加一个新对象,都需要处理更多的顶点,因此 FPS 会降低。

由于我是openGl的初学者,我对提高性能有一些一般性的想法,我只是不知道openGl允许我做什么。

  1. 由于我的大多数对象都是相同的(相同数量的顶点、相同的颜色、相同的 uv 和相同的法线),但只有对象的位置和旋转不同,是否可以在每个对象上只发送一次相似对象的顶点frame render ,然后为所有对象调用 drawElements 并仅修改对象位置?

  2. 是否有可能更进一步,上传那些相似的顶点,仅在第一次创建场景时上传一次,并且在每一帧渲染上只为每个对象调用 drawElements?

目前,我正在发送每个对象的顶点,如下所示:

.......
gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
gl.glPushMatrix();
gl.glTranslatef(position);
gl.glRotatef(rotation);
gl.glScalef(scale);    
gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
gl.glPopMatrix();
........

我在想我应该做这样的事情:

.......
gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
for(eachObject)
{
gl.glPushMatrix();
gl.glTranslatef(position);
gl.glRotatef(rotation);
gl.glScalef(scale);
gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
gl.glPopMatrix();
........
}
4

1 回答 1

2
  1. 是的
  2. 是的(甚至更好)

您的第二个代码示例看起来与您应该做的完全一样。

没有理由需要多次上传顶点,在初始化时这样做就足够了。之后,只需在您想要渲染的任何时候设置指针。您可以根据需要使用不同的平移/旋转多次调用 glDrawElements。

于 2012-06-05T08:24:39.230 回答