在2D OpenGL(Android)中制作动画的纹理

时间:2012-07-20 21:29:15

标签: android opengl-es textures

我一直在寻找答案,但没有找到任何具体的答案。

我想知道这两个例子与速度和性能有什么关系。提前谢谢!

我正在2D中制作一个openGL ES 1.0 Android游戏。为了动画人物,我使用不同的纹理。纹理有两个可能性:

第一个是将每个纹理放在一个int数组中,并根据框架改变选择哪一个:

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[actual_id]);

另一方面,我们可以在所有图像上都有一个“大”纹理,只需修改纹理坐标即可。在这种情况下,而不是:

private float textures[] = {
    // Mapping coordinates for the vertices
    0.0f, 1.0f,     // top left     (V2)
    0.0f, 0.0f,     // bottom left  (V1)
    1.0f, 1.0f,     // top right    (V4)
    1.0f, 0.0f      // bottom right (V3)
};

(这将是第一种情况中的那个)它将是:

private float textures[] = {
    // Mapping coordinates for the vertices
    0.0f, 0.5f,     // top left     (V2)
    0.0f, 0.0f,     // bottom left  (V1)
    0.5f, 0.5f,     // top right    (V4)
    0.5f, 0.0f      // bottom right (V3)
};

(使用2x2框)这些坐标应该在纹理周围移动。

我想知道哪个可能是最快的。此外,如果有第三种最好的方式,我也很想知道它。

感谢您的时间。如果我必须详细说明这个问题,请问我。

1 个答案:

答案 0 :(得分:0)

我认为这个问题没有一般性的答案,因为它取决于其他一些事情。

我假设除了要绘制的角色外,还有很多其他对象。让我们假设你有一个看起来像这样的游戏循环:

while (gameNotFinished) {
  changeToTerrainTexture()
  drawTerrain()
  changeToCharacterTexture()
  drawCharacter() // the character you want to draw
  changeToHouseTexture()
  drawHouse()
  ...
}

在这种情况下,您无论如何都必须更改为角色纹理。第一种方法是更好的解决方案,因为较小的纹理需要较少的纹理内存。

但是如果你的循环看起来像这样:

while (gameNotFinished) {
  changeToTerrainTexture()
  drawTerrain()
  changeToCharacterTexture()
  for (int i = 0; i < characters.size(); i++) {
    characters.get(i).draw()
  }
  ...
}

在这种情况下,你可以从第二种方式中获利,因为你可以在不改变纹理的情况下在不同的动画状态下显示多个角色。

我不知道OpenGl ES 1.0是否有任何替代方案。使用ES 2.0,您可以选择将一个纹理用于​​多个动画状态(如第二个方法)并计算着色器中的纹理坐标偏移(因此您不需要多个纹理坐标数组)。