使用顶点缓冲对象和纹理集来制作瓦片游戏

3
我正在使用C#和OpenGL创建一个基于瓦片的游戏,我正在尽力优化我的代码。
我已经阅读了几篇文章和书籍中的章节,它们都得出了同样的结论(您可能已经知道),即使用VBO可以大大提高性能。
然而,我不太确定它们究竟是如何工作的。
我的游戏将在屏幕上显示瓦片,有些会改变,有些则保持不变。要为此使用VBO,我需要将每个瓦片的坐标添加到数组中,对吗?
此外,为了给这些瓦片贴上纹理,我需要创建一个单独的VBO吗?
如果我有一些动画的瓦片和一些静态的瓦片,我不太确定铺设这些坐标的代码会是什么样子。有人能简单地向我解释一下吗?
我计划使用一个包含所有瓦片的纹理图集。我不确定从哪里开始为带纹理的瓦片使用这个图集。我需要计算应用于图集中瓦片的坐标吗?是否有任何方法可以直接使用图集的坐标来应用纹理?
如果有人能解答这些问题,我将不胜感激。如果需要,我甚至可以支付一些报酬来感谢您的时间和帮助。
谢谢,
Greg
1个回答

7

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

VBO


当考虑作为客户端顶点数组的替代品时,顶点缓冲对象大多能节省GPU带宽。瓦片地图并不是很复杂的几何体。然而,在最近的GL版本中,顶点缓冲对象是指定顶点的唯一方式(这是很有意义的),因此我们在这里不能真正谈论“提高性能”。如果你指的是与已弃用的顶点规范方法(如立即模式或客户端数组)相比,则是的,你会获得性能提升,但我想你可能只会感觉到每帧10k+个顶点。

纹理集


纹理图集确实是一项很好的功能,可以节省纹理切换方面的麻烦。然而,在启用GL3(和DX10)的GPU上,你可以避免这种技术所特有的很多问题,因为现代化和方便的方法可用。在GL参考文档中查找TEXTURE_2D_ARRAY - 你会喜欢它的。如果GL3卡是你的目标,请忘记纹理图集。否则,请搜索一下哪些旧卡支持纹理数组作为扩展,我不太熟悉细节。

渲染


那么如何高效绘制瓷砖地图呢?让我们关注数据。有很多瓷砖,每个瓷砖都有以下信息:
  • 网格位置(x,y)
  • 材质(我们称之为"material"而不是"texture",因为像你说的图像可能是动态变化的; "material"则会被解释为"一种或多种随时间变化的纹理"或任何你想要的)。
这应该是你需要发送到GPU的所有“per-tile”数据。您想将每个瓷砖呈现为四边形或三角形带,因此您有两个选择:
  • 与其在每个瓷砖上只发送(x,y),不如发送4个顶点(x,y),(x+w,y),(x+w,y+h),(x,y+h),
  • 使用几何着色器计算每个1个点的4个点以及纹理坐标。
选择您喜欢的方式。还要注意,这直接对应于您的VBO将包含的内容——后者的解决方案将使其小4倍。
对于材质,您可以将其作为符号整数传递,在片段着色器中-基于当前时间(作为统一变量传递)和给定瓷砖的材质ID-您可以决定使用纹理数组中的纹理ID。通过这种方式,您可以创建简单的纹理动画。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接