2013-09-29 36 views
0

我使用PyOpenGL来实现一个小的2D游戏引擎。我在执行Sprite类的方式上犹豫不决。最快的方法来实现精灵

我已经将所有的场景(平铺地图)保存在VBO中,并且所有纹理都保持相同的大纹理。所有精灵的图像也都在这个纹理中。所以我认为,为了表现,我应该把这个精灵包含在VBO中,比如从位置sprite_start_position开始。

的第一个问题是:因为一个精灵可以有几个立场(图像),是它更好地:

  • 设置只有一个VBO的精灵条目,该条目修改纹理COORDS相应的姿态,用glBufferSubData
  • 因为有立场的VBO设置尽可能多的条目,但仅绘制了当前与glDrawArrays
  • 其他?

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

  • 变化的VBO与glBufferSubData
  • 权项的位置之前glDrawArrays(GL_QUADS, sprite_start_position, 1)
  • 其他使用一些glTranslate

我是比较新的OpenGL和我还是觉得有点这个API中输了...

+0

最快的方法是使用现有的游戏库xD – user2246674

+0

它主要用于学习目的,所以我不想。 – Fred

+1

相信与否,您可以使用矩阵解决所有这些问题。您可以像定位'glMatrixMode(GL_MODELVIEW)'一样来变换纹理矩阵'glMatrixMode(GL_TEXTURE)'。这就是我如何使用着色器来处理问题,而不是每帧改变顶点缓冲区内精灵的顶点或纹理坐标数据,只需为纹理坐标和位置提供适当的变换矩阵即可。 –

回答

1

你真的不应该担心了简单的精灵基于2D游戏性能。你的图形卡每秒可以渲染几十或几十万个三角形(或更多!),这比你可能需要的要多方式

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

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

+0

感谢您的回答。我可以确保你确实有这种做法,特别是在使用Python的时候... ... 我也在现代OpenGL上找到好的信息并不是那么容易:要么你发现不推荐的技术,要么文章假设你已经掌握了基本的OpenGL。 我发现学习现代3D图形编程,由杰森L.麦克森,相当启发,即使它涵盖远远超过我实际需要,但不涉及3D纹理(或我还没有达到它呢)。 – Fred

+0

3D纹理就像是一堆2D纹理。例如,每个人都可能是动画中的一个框架。第三维将代表时间。零将是第一帧,1.0将是最后一帧。线性插值然后提供帧之间的平滑过渡。 – fintelia

+0

如果您在网上找不到东西,请随时提出更多问题! – fintelia