【问题标题】:Using Vertex Buffer Objects for a tile-based game and texture atlases将顶点缓冲区对象用于基于图块的游戏和纹理图集
【发布时间】:2011-05-21 17:54:40
【问题描述】:

我正在使用 OpenGL 用 C# 创建一个基于图块的游戏,并且我正在尝试尽可能优化我的代码。

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

不过,我不太确定它们是如何工作的。

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

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

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

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

如果有人能解决这些问题,将不胜感激。如果需要,我什至可以报销某人的时间和帮助。

谢谢,

格雷格

【问题讨论】:

    标签: opengl textures tile vbo


    【解决方案1】:

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

    VBO


    当考虑作为客户端顶点数组的替代品时,顶点缓冲区对象主要节省 GPU 带宽。瓦片地图实际上并不是很多几何图形。然而,在最近的 GL 版本中,顶点缓冲区对象是指定顶点的唯一方式(这很有意义),因此我们不能在这里真正谈论“提高性能”。如果您的意思是“与不推荐使用的顶点规范方法(如立即模式或客户端数组)相比”,那么是的,您将获得性能提升,但您可能只会在每个 10k+ 顶点时感受到它框架,我想。

    纹理图集


    纹理图集确实是节省纹理切换的好功能。但是,在支持 GL3(和 DX10)的 GPU 上,您可以为自己省去很多这种技术所特有的麻烦,因为有一种更现代、更方便的方法可用。检查GL reference docsTEXTURE_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 - 您可以从要使用的纹理数组。这样就可以制作出简单的纹理动画了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2011-05-28
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多