【问题标题】:Avoiding Duplicate Data in OpenGL Buffers避免 OpenGL 缓冲区中的重复数据
【发布时间】:2014-07-03 12:19:47
【问题描述】:

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

话虽如此,当每个瓦片都有自己的颜色时,这是一种单一的纯色(不是纹理或渐变),我实际上是将一个与顶点数组大小相同的数组传递给着色器,即使瓷砖的所有 6 个顶点的颜色都是恒定的!这似乎非常浪费,因为它本质上是相同的数据 x6。有没有办法在渲染地图时每 6 个顶点有效地重用相同的数据?

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

当前的方法确实有效,而且速度非常快(GT 750m 上 256x256 瓦片为 2000 fps),但我不禁为简单地复制整个数组中的数据以匹配每个顶点而感到内疚,即使每个图元的数据是恒定的(实际上是 2 个图元:组成方形图块的两个三角形)。他们肯定有更好的方法吗?

【问题讨论】:

    标签: opengl attributes glsl shader


    【解决方案1】:

    你有多种方法可以解决你的问题。

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      相关资源
      最近更新 更多