我正在使用OpenGL在C#中创建基于磁贴的游戏,我正在尝试尽可能优化我的代码。
我已经阅读了几本书中的文章和章节,并得出了相同的结论(您可能知道),使用VBO可以大大提高性能。
但是,我不太确定它们是如何正常工作的。我的游戏将在屏幕上显示切片,有些会改变,有些会保持不变。 要使用VBO,我需要将每个图块的坐标添加到数组中,对吗?
另外,为了纹理这些图块,我必须为此创建一个单独的VBO?
如果我有动画的图块和屏幕上的静态图块,我不太清楚这些坐标的平铺代码是什么样的。 有人能给我一个快速的概述吗?
我打算使用我所有瓷砖的纹理图集。我不知道从哪里开始使用这个地图集的纹理瓷砖。 我是否需要计算要应用的地图集中瓷砖的坐标?有什么方法可以简单地使用地图集的坐标来应用纹理吗?
如果有人能够澄清这些问题,我们将不胜感激。我甚至可以报销某人的时间和时间。如果需要帮助。
谢谢,
格雷格
答案 0 :(得分:7)
好的,让我们把它分成几部分。 您没有指定要使用的OpenGL版本 - 我将假设GL 3.3。
顶点缓冲区对象,当被视为客户端顶点阵列的替代方案时,主要是保存GPU带宽。平铺贴图实际上不是很多几何体。但是,在最近的GL版本中,顶点缓冲区对象是指定顶点的唯一方式(这很有意义),所以我们在这里不能真正谈论“提高性能”。如果你的意思是“与不推荐的顶点规范方法(如立即模式或客户端数组)进行比较,那么是的,你将获得性能提升,但你可能只感觉到每个10k +顶点框架,我想。
纹理地图集确实是一个很好的功能,可以节省纹理切换。但是,在支持GL3(和DX10)的GPU上,您可以为这种技术节省很多麻烦,因为可以使用更现代,更方便的方法。查看TEXTURE_2D_ARRAY
{{1}} - 您会喜欢它。如果GL3牌是你的目标,忘记纹理地图集。如果没有,有一个谷歌旧卡支持纹理阵列作为扩展,我不熟悉的细节。
那么如何有效地绘制瓷砖地图?让我们关注数据。有很多瓷砖,每个瓷砖都有以下信息:
这应该是您需要发送到GPU的所有“每个磁贴”数据。您希望将每个图块渲染为四边形或三角形条带,因此您有两种选择:
选择你最喜欢的。另请注意,这与您的VBO将包含的内容直接对应 - 后一种解决方案会使其缩小4倍。
对于材质,您可以将其作为符号整数传递,并在片段着色器中 - 基于当前时间(作为统一变量传递)和给定图块的材质ID - 您可以决定纹理ID要使用的纹理数组。通过这种方式,您可以制作简单的纹理动画。