2014-07-03 41 views
1

我试图在OpenGL(最低版本3.3)中绘制由瓦片制成的地图。他们目前正在做的这种方式是将地图上每个图块的所有顶点数据编译成单个数组,然后将数据绑定到顶点数组中的缓冲区。法线和纹理坐标也是这种情况;每个都有自己的缓冲区。然后有一个指向该数据的顶点属性指针,以便顶点着色器获得该数据。这就是说,当谈到每个瓷砖有自己的颜色,这是一个单一的纯色(而不是纹理或渐变),我本质上是传递一个大小与顶点数组大小相同的数组到一个数组中着色器,即使瓦片的所有6个顶点的颜色都是恒定的!这看起来非常浪费,因为它基本上是相同的数据x6。在渲染地图时,是否有办法有效地每6个顶点重复使用相同的数据?在OpenGL缓冲区中避免重复的数据

我会为每个瓷砖使用统一或属性,但请记住所有瓷砖都放置在单个顶点数组中,因此我无法单独为每个瓷砖重新绑定这些瓷砖。

目前的方法确实有效,它的速度非常快(GT 750m上的256x256瓦片的速度为2000 fps),但我不禁感到内疚,因为它只是复制整个阵列中的数据,因此它与每个顶点匹配,甚至尽管每个图元的数据是不变的(实际上2个图元:构成方形图块的两个三角形)。当然,他们必须是更好的方式?

回答

1

您有各种方法可以解决您的问题。

  1. 调色板:使用顶点属性(只是一个UBYTE)从256名制服的颜色(颜色是3/4 ubytes所以你刚才保存的2/3 ubytes阵列选择各拼贴的值)。当然,我假设你有不超过256种不同的颜色(你很可能使用短期和高达65536个色,如果256是不够的)

  2. 几何/曲面细分着色器:如果瓷砖都只是方形或其他简单形状,那么你必须把一个顶点作为输入,并给出一些基本信息(如瓦片的大小),你发出完整的图元(这可以让你减少5倍或更多的数据量,但你必须学会​​很多额外的GL功能,反正也不坏)