【问题标题】:Fastest way to implement a sprite [closed]实现精灵的最快方法[关闭]
【发布时间】:2013-10-05 17:01:47
【问题描述】:

我正在使用 PyOpenGL 来实现一个小型 2D 游戏引擎。我对实现 Sprite 类的方式犹豫不决。

我已经将所有场景(平铺地图)保存在 VBO 中,并且所有纹理都保存在同一个大纹理中。所有精灵的图像也在这个纹理中。所以我想,为了性能,我应该在 VBO 中包含精灵,比如说从 sprite_start_position 位置。

第一个问题是:既然一个精灵可以有多个姿势(图像),是否更好:

  • 在 VBO 中只为精灵设置一个条目,并根据姿态修改此条目中的纹理坐标,使用 glBufferSubData
  • 在 VBO 中设置与立场一样多的条目,但仅使用 glDrawArrays 绘制当前条目
  • 其他?

第二个与精灵位置类似。我必须:

  • glBufferSubData更改VBO中右侧条目的位置
  • glDrawArrays(GL_QUADS, sprite_start_position, 1)之前使用一些glTranslate
  • 其他?

我对 OpenGL 比较陌生,我仍然对这个 API 感到有些迷茫......

【问题讨论】:

  • 最快的方法是使用现有的游戏库 xD
  • 主要是为了学习,所以不想。
  • 信不信由你,您可以使用矩阵解决所有这些问题。您可以像定位glMatrixMode (GL_MODELVIEW) 一样变换纹理矩阵glMatrixMode (GL_TEXTURE)。这也是我使用着色器解决问题的方法,而不是每帧都在顶点缓冲区内更改精灵的顶点或纹理坐标数据,只需为纹理坐标和位置提供适当的变换矩阵。
  • 感谢您的回答。我会检查的。
  • 我真的不明白为什么这篇文章基于意见而被搁置:如果我要求“最好的方式”,那将是主观的。我故意要求“最快的方式”,因为它是客观的(如果需要,你可以用基准来衡量它)。此外,我询问了两种技巧,正是为了避免过于公开的讨论。

标签: python opengl vbo pyopengl


【解决方案1】:

您真的不必担心基于精灵的简单 2D 游戏的性能。您的显卡每秒能够渲染数万或数十万个三角形(或更多!),这您可能需要的更多。

因此,您选择使用哪种方法来更新精灵并不重要。但是,如果您想要动画精灵,我建议您查看 3D 纹理。它们允许您在动画帧之间进行插值,从而使您的动画看起来更好!

作为旁注,您提到使用 glTranslate,这是 OpenGL 1.x/2.x 中的一个函数,已从更高版本的 API 中删除。我建议您尝试使用“现代 OpenGL”(即 OpenGL 3.x/4.x)。您可以在网上找到大量有关差异的信息。也就是说,如果您有特定的原因,仍然可以使用旧版本的 API,并且如果您使用像 glTranslate 这样的功能将继续工作。

【讨论】:

  • 感谢您的回答。我可以向您保证,尽管这样做有错误的方法,特别是在使用 Python 时... .我发现 Jason L. McKesson 的 Learning Modern 3D Graphics Programming 非常有启发性,即使它涵盖的内容远远超出我的实际需要,但不涉及 3D 纹理(或者我还没有达到它)。
  • 3D 纹理就像一堆 2D 纹理。例如,每个都可以是动画中的一帧。第三维度将代表时间。零是第一帧,1.0 是最后一帧。然后线性插值提供帧之间的平滑过渡。
  • 如果有网上找不到的东西,请随时提出更多问题!
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多