我正在开发一款游戏,在屏幕上渲染类似的对象。问题是每次添加新对象时,都需要处理更多的顶点,因此 FPS 会降低。
由于我是 openGl 的初学者,我对提高性能有一些大致的想法,我只是不知道 openGl 允许我做什么。
-
由于我的大多数对象都是相同的(相同数量的顶点,相同的颜色,相同的UV和相同的法线),但只有对象的位置和旋转不同,是否可以在每个帧渲染上只发送一次相似对象的顶点,然后为所有对象调用drawElements并仅修改对象位置?
-
是否有可能更进一步,上传那些相似的顶点,仅在场景第一次创建时上传一次,并且在每帧渲染上只需为每个对象调用 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();
........
}
- 是的
- 是的(甚至更好)
您的第二个代码示例看起来与您应该执行的操作完全相同。
您没有理由需要多次上传顶点,在初始化时这样做就足够了。之后,只需在要渲染的任何时间设置指针即可。你可以调用glDrawElements,你可以使用不同的平移/旋转多次。