OpenGL ES 1.1每个网格多个纹理

时间:2011-01-07 17:18:52

标签: android opengl-es

我对OpenGL很新,所以如果这可能非常基本(或没有意义),我很抱歉。

我正在开发一款2D游戏,其中有很多精灵,其大小不是两个。所以我会有像520x260这样的纹理,并且无法重新设计。现在我的理解是,由于OpenGL ES 1需要纹理为2的幂,我实际上会浪费大量内存(因为我之前的例子中的纹理实际上占用了硬件上的1024x512)。

我一直在想的是,不是让精灵是两个三角形,而是一个大的纹理,我可能让精灵由更小的三角形组成,并且我可以在较小的三角形中分解为大的纹理pow2块(比如128x128)可以在这些三角形上单独使用(使用类似网格图的东西)。

所以我的问题是:对单个网格使用多个纹理是否可行且可行?如果是这样,那么额外的计算(所有较小的三角形和纹理化所必需的)是否值得纹理存储器保存?

P.S。我正在使用Android,但我认为这并没有太大区别。

2 个答案:

答案 0 :(得分:1)

绝对可以而且应该这样做以节省内存。您唯一需要担心的是UV映射。您必须根据排列网格的方式调整UV坐标。

例如,假设你想在128x128网格中填充三个纹理:

+-----------------+
|1.               |
|     128x64      |
|                 |
+-----------------+
|2.      |3.      |
| 64x64  |  64x64 |
|        |        |
+--------+--------+

如果要映射每个纹理,则UV坐标范围如下:

  1. 从(0.0,0.0)到(1.0,0.5)
  2. 从(0.0,0.5)到(0.5,1.0)
  3. 从(0.5,0.5)到(1.0,1.0)
  4. 您必须将这些相应地转换为您的顶点。

答案 1 :(得分:1)

我很确定纹理不必与精灵相同。如果你有精灵520x260,你应该能够将纹理缩小到512x256并将其映射到你的精灵上,而不会注意到稍微小一点的分辨率。