好的,让我们把它分成几部分。您没有指定要使用的 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使用。这样就可以制作简单的纹理动画了。