使用 OpenGL 的 2D Sprite 动画技术

Zye*_*end 4 c++ opengl animation vbo sprite

我目前正在尝试使用 OpenGL 4 设置 2D 精灵动画。例如,我用 Gimp 设计了一个平滑旋转的球。大约有 32 个框架(4 行 8 个框架)。

我的目标是在 2D 纹理中创建精灵图集,并将精灵数据存储在缓冲区 (VBO) 中。我的精灵矩形将始终相同(即 rect(0,0,32,32) ),但每次帧索引递增时,我的纹理坐标都会发生变化。

我想知道如何修改坐标。

  1. 由于精灵图块存储在几行中,因此在着色器中管理起来似乎很困难。
  2. 使用 glBufferSubData() 修改缓冲区内的精灵纹理坐标?

我花了很多时间研究 OpenGL 1.x……几个月前我又回到了 OpenGL,但我意识到很多事情都发生了变化。我会尝试几种选择,但欢迎您的建议和经验。

der*_*ass 5

由于精灵图块存储在几行中,因此在着色器中管理起来似乎很困难。

并非如此,所有精灵的大小都相同,因此您会得到一个完美的统一网格,并且从某个一维索引到二维只是除法和取模的问题。并不难。

但是,为什么要将单个帧存储在mxn网格中呢?现在您可以将它们存储在一排中。然而,在现代 GL 中,我们有数组纹理。这些基本上是一组独立的 2D 层,全部大小相同。您只需通过 3D 坐标访问它们,第三个坐标是从 o 到 n-1 的图层。这非常适合您的用例,并且将消除边界处的纹理过滤/渗色的任何问题,并且它也可以很好地与 mipmapping 配合使用(如果您需要的话)。当引入阵列纹理时,实现需要支持的最小层数为 64(现在要高得多),因此即使对于旧 GPU,32 帧也将是小菜一碟。