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