Android openGL尝试通过对多个网格使用相同的顶点来提高FPS



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

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

  1. 由于我的大多数对象都是相同的(相同数量的顶点,相同的颜色,相同的UV和相同的法线),但只有对象的位置和旋转不同,是否可以在每个帧渲染上只发送一次相似对象的顶点,然后为所有对象调用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();
........
}
  1. 是的
  2. 是的(甚至更好)

您的第二个代码示例看起来与您应该执行的操作完全相同。

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

最新更新