Opengl 为基于平铺的游戏和纹理地图集使用顶点缓冲区对象

Opengl 为基于平铺的游戏和纹理地图集使用顶点缓冲区对象,opengl,textures,tile,vbo,Opengl,Textures,Tile,Vbo,我正在用OpenGL在C#中创建一个基于平铺的游戏,并试图尽可能优化我的代码 我在书中读过几篇文章和章节,都得出了相同的结论(如您所知),使用VBOs可以极大地提高性能 然而,我不太确定它们到底是如何工作的 我的游戏将在屏幕上有瓷砖,有些会改变,有些会保持不变要使用VBO进行此操作,我需要将每个磁贴的坐标添加到数组中,对吗? 此外,要对这些瓷砖进行纹理处理,我必须为此创建一个单独的VBO? 如果我在屏幕上有动画的瓷砖和静态的瓷砖,我不太确定平铺这些坐标的代码会是什么样子。 有人能给我简要介绍一下

我正在用OpenGL在C#中创建一个基于平铺的游戏,并试图尽可能优化我的代码

我在书中读过几篇文章和章节,都得出了相同的结论(如您所知),使用VBOs可以极大地提高性能

然而,我不太确定它们到底是如何工作的

我的游戏将在屏幕上有瓷砖,有些会改变,有些会保持不变要使用VBO进行此操作,我需要将每个磁贴的坐标添加到数组中,对吗?

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

如果我在屏幕上有动画的瓷砖和静态的瓷砖,我不太确定平铺这些坐标的代码会是什么样子。 有人能给我简要介绍一下吗?

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

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

谢谢


格雷格

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

VBO
顶点缓冲区对象被视为客户端顶点阵列的替代对象时,主要节省GPU带宽。平铺贴图实际上不是很多几何体。但是,在最近的GL版本中,顶点缓冲区对象是指定顶点的唯一方法(这很有意义),因此我们不能在这里真正谈论“提高性能”。如果您的意思是“与不推荐的顶点规范方法(如即时模式或客户端阵列)相比”,那么是的,您将获得性能提升,但我想,您可能只会在每帧10k+顶点的情况下感觉到

纹理图谱
纹理地图集确实是一个很好的特性,可以在纹理切换时保存。然而,在支持GL3(和DX10)的GPU上,您可以省去这项技术带来的许多麻烦,因为有一种更现代、更方便的方法可用。检查
纹理\u 2D\u数组
-您会喜欢它的。如果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。通过这种方式,可以制作简单的纹理动画