3

我正在使用 OpenGL 在 C# 中创建一个基于图块的游戏,并且我正在尝试尽可能地优化我的代码。

我已经阅读了书籍中的几篇文章和章节,并且都得出了相同的结论(您可能知道),即使用 VBO 可以大大提高性能。

但是,我不太确定它们是如何工作的。

我的游戏将在屏幕上显示图块,有些会改变,有些会保持不变。要为此使用 VBO,我需要将每个图块的坐标添加到数组中,对吗?

此外,要纹理这些瓷砖,我必须为此创建一个单独的 VBO?

如果我有动画的图块和屏幕上的静态图块,我不太确定平铺这些坐标的代码会是什么样子。 谁能给我一个快速的纲要?

我计划使用我所有瓷砖的纹理图集。我不确定从哪里开始使用这个图集来制作纹理瓷砖。 我是否需要计算要应用的地图集中瓷砖的坐标?有什么方法可以简单地使用图集的坐标来应用纹理?

如果有人能澄清这些问题,将不胜感激。如果需要,我什至可以报销某人的时间和帮助。

谢谢,

格雷格

4

1 回答 1

7

好的,让我们把它分成几部分。您没有指定要使用的 OpenGL 版本 - 我假设 GL 3.3。

伊博


顶点缓冲区对象,当被认为是客户端顶点数组的替代品时,主要节省了 GPU 带宽。瓦片地图实际上并不是很多几何图形。然而,在最近的 GL 版本中,顶点缓冲区对象是指定顶点的唯一方法(这很有意义),所以我们不能在这里真正谈论“提高性能”。如果您的意思是“与不推荐使用的顶点规范方法(如立即模式或客户端数组)相比”,那么是的,您将获得性能提升,但我想您可能只会在每帧 10k+ 个顶点时感受到它。

纹理图集


纹理图集确实是节省纹理切换的好功能。但是,在支持 GL3(和 DX10)的 GPU 上,您可以为自己省去很多这种技术所特有的麻烦,因为有一种更现代、更方便的方法可用。检查GL 参考文档TEXTURE_2D_ARRAY- 你会喜欢的。如果 GL3 卡是您的目标,请忘记纹理图集。如果没有,请谷歌哪个旧卡支持纹理数组作为扩展,我不熟悉细节。

渲染


那么如何高效地绘制瓦片图呢?让我们专注于数据。有很多瓷砖,每个瓷砖都有以下信息:

  • 网格位置 (x,y)
  • 材料(我们称它为“材料”而不是“纹理”,因为正如您所说,图像可能是动画并随时间变化;“材料”将被解释为“一个纹理或一组随时间变化的纹理”或任何你想)。

这应该是您需要发送到 GPU 的所有“每块”数据。您想将每个图块渲染为四边形或三角形条,因此您有两种选择:

  • 每个图块发送 4 个顶点 (x,y),(x+w,y),(x+w,y+h),(x,y+h) 而不是 (x,y),
  • 使用几何着色器计算 4 个点以及每发送 1 个点的纹理坐标。

选择你最喜欢的。另请注意,这直接对应于您的 VBO 将包含的内容 - 后一种解决方案将使其小 4 倍。

对于材质,您可以将其作为符号整数传递,并且在片段着色器中 - 基于当前时间(作为统一变量传递)和给定图块的材质 ID - 您可以从纹理数组中决定纹理 ID使用。这样就可以制作简单的纹理动画了。

于 2010-12-08T00:49:14.253 回答