将“顶点缓冲区对象”用于基于图块的游戏和纹理图集

时间:2010-12-07 17:26:48

标签: opengl textures tile vbo

我正在使用OpenGL在C#中创建基于磁贴的游戏,我正在尝试尽可能优化我的代码。

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

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

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

另外,为了纹理这些图块,我必须为此创建一个单独的VBO?

如果我有动画的图块和屏幕上的静态图块,我不太清楚这些坐标的平铺代码是什么样的。 有人能给我一个快速的概述吗?

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

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

谢谢,

格雷格

1 个答案:

答案 0 :(得分:7)

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

VBO


顶点缓冲区对象,当被视为客户端顶点阵列的替代方案时,主要是保存GPU带宽。平铺贴图实际上不是很多几何体。但是,在最近的GL版本中,顶点缓冲区对象是指定顶点的唯一方式(这很有意义),所以我们在这里不能真正谈论“提高性能”。如果你的意思是“与不推荐的顶点规范方法(如立即模式或客户端数组)进行比较,那么是的,你将获得性能提升,但你可能只感觉到每个10k +顶点框架,我想。

纹理图集


纹理地图集确实是一个很好的功能,可以节省纹理切换。但是,在支持GL3(和DX10)的GPU上,您可以为这种技术节省很多麻烦,因为可以使用更现代,更方便的方法。查看TEXTURE_2D_ARRAY {{1}} - 您会喜欢它。如果GL3牌是你的目标,忘记纹理地图集。如果没有,有一个谷歌旧卡支持纹理阵列作为扩展,我不熟悉的细节。

渲染


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

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

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

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

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

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