避免OpenGL缓冲区中的重复数据

时间:2014-07-03 12:19:48

标签: opengl attributes glsl shader

我试图在OpenGL中绘制由瓷砖制成的地图(至少是版本3.3)。我现在这样做的方法是将地图上每个图块的所有顶点数据编译成单个数组,并将该数据绑定到顶点数组内的缓冲区。法线和纹理坐标也是如此;每个都有自己的缓冲区。然后有一个指向该数据的顶点属性指针,以便顶点着色器获取它。

话虽如此,当涉及每个具有自己颜色的瓷砖时,这是一种单一的纯色(不是纹理或渐变),我基本上传递了一个相同尺寸的阵列作为着色器中的顶点数组,即使颜色对于图块的所有6个顶点都是常量!这看起来非常浪费,因为它基本上是相同的数据x6。有没有办法在渲染地图时每6个顶点有效地重用相同的数据?

我会为每个图块使用一个统一或属性,但请记住所有图块都放在一个顶点数组中,因此我无法分别为每个图块重新绑定它们。

当前的方法确实有效,而且速度非常快(GT 750m上的256x256磁贴为2000 fps),但我无法简单地在整个阵列中复制数据,因此它与每个顶点相匹配,即使数据对于每个图元是恒定的(实际上是2个图元:构成正方形图块的两个三角形)。当然他们必须是一个更好的方式?

1 个答案:

答案 0 :(得分:1)

你有各种方法来克服你的问题。

  1. 选项板:使用顶点属性(只是一个ubyte)为每个磁贴选择一个256个统一颜色的数组中的值(颜色为3/4 ubytes,所以你刚刚保存2/3 ubytes)。当然我假设你有不超过256种不同颜色(如果256还不够,你可能会使用短颜色和最多65536种颜色)

  2. 几何/曲面细分着色器:如果图块只是正方形或其他简单形状,那么您必须将单个顶点作为输入并给出一些基本信息(如图块的大小)发出完整的原语(这只允许你将数据大小减少5倍或更多,但你必须学习很多额外的GL功能,不管怎么说都不错)