【问题标题】:OpenGL ES 1.1 multiple textures per meshOpenGL ES 1.1 每个网格有多个纹理
【发布时间】:2011-01-07 17:18:51
【问题描述】:

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

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

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

所以我的问题是:为单个网格使用多个纹理是否可行且可行?如果是这样,额外的计算(所有较小的三角形和纹理化它们所必需的)是否值得节省纹理内存?

附:我正在开发 Android,但我认为这不会有太大的不同。

【问题讨论】:

  • 好吧,根据您的回答,我继续执行此操作。它似乎确实产生了积极的影响!如果不出意外,我至少可以剔除更多的每个精灵(当它离开屏幕时),因为它现在被分解成更小的部分。

标签: android opengl-es


【解决方案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)

您必须将这些相应地翻译到您的顶点上。

【讨论】:

  • 嗯,我在想只使用统一的网格会更容易(所以纹理切片都是相同的大小)。我已经有一些用于网格地图的工作代码(改编自 Replica Island),但是它使用单个纹理来处理多个图块 - 所以我需要使用多个纹理使其反过来工作。不过,我想实施起来应该不会太难。我主要关心的是这是否是个好主意。
【解决方案2】:

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

【讨论】:

  • 嗯,这只是一个极端的例子——实际上差异可能不会那么接近。因此,我想避免拉伸纹理。
  • 好吧,回答你的问题,是的,在大多数情况下,为了减轻图形管道的负载,进行额外的计算是值得的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多