如何在opengl中绘制许多小的位图

时间:2013-07-29 18:46:02

标签: java android performance opengl-es bitmap

我是opengl的新手,我想快速绘制很多位图。我写了几个类来绘制位图。如果我使用类来快速绘制几个大位图,但如果我使用它来绘制许多小位图它的速度很慢。这是我的代码:

画家班:

 public void draw(int id, FloatBuffer vertexBuffer) {
     // bind the previously generated texture
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[id]);

     // Point to our buffers
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

     gl.glEnable(GL10.GL_BLEND);
     gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

     gl.glColor4f(1,1,1,1);

     // Set the face rotation
     gl.glFrontFace(GL10.GL_CW);

     // Point to our vertex buffer
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

     // Draw the vertices as triangle strip      
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

     //Disable the client state before leaving
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 }

然后我称之为:

 painter.draw(bmp, vert);

“bmp”是int值,vert是FloatBuffer。 位图在每个帧中改变位置,所以我为每个位图计算每帧中的FloatBuffer。

您认为有更快的方式来绘制它吗?

1 个答案:

答案 0 :(得分:0)

我的建议是将你需要渲染的所有位图的顶点放在一个大的顶点数组中,然后一次渲染。但是,为了避免手动切换纹理,您必须使用所有位图创建纹理图集,或者使用array textures,如果您可以使用它们(需要OpenGL 3或EXT_texture_array)。