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

CPa*_*ton 3 opengl textures vbo tile

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

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

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

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

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

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

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

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

谢谢,

格雷格

Kos*_*Kos 7

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

VBO


当顶点缓冲对象被视为客户端顶点数组的替代时,它们主要保存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),
  • 使用几何着色器计算发送的每1个点的4个点以及纹理坐标.

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

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