如何跟踪向量中非唯一元素的索引?

如何跟踪向量中非唯一元素的索引?

问题描述:

我很可能会这样做的方式错误,但我想知道是否有人对如何跟踪矢量内的非唯一元素的位置有一些建议?如何跟踪向量中非唯一元素的索引?

我使用glDrawArraysInstanced并使用向量来存储偏移特定实例位置的翻译(即第一个元素是x翻译,第二个y,第三个z,重复)。这个向量被放入一个缓冲区,并且绘图按预期工作,并且使用实例化可以提高性能。我不想根据gl_InstanceID设置位置,因为ID根据实例的数量而变化,但我需要实例保持一致。

当试图使实例的数量变为动态时,问题就出现了;我需要能够有效地添加和删除矢量中的元素,而不必在每次更改时重新构建整个矢量。不过,我不确定如何确定翻译在矢量内部的确切位置。


作为一个例子:

  • 实例0使用翻译0,1,2
  • 实例1使用翻译3,4,5-
  • 实例2使用翻译6,7,8

要删除实例1:

我可以存储翻译的x分量的指数时,翻译后首先构造,所以我知道我需要.erase 3个元素开始于3

要删除实例2:

怎么办我知道这个例子的起始索引是什么?施工期间储存的指数不再有效。


我知道这种情况下是微不足道的,我可以只从最初存储的索引减,但如果我有说40000个实例是有一个有效的方式来永远知道具体的翻译该实例是矢量内?在多次添加/删除实例之后,指数可以转移相当数量。

注:我想使用矢量,因为OpenGL需要float *来填充缓冲区。我可以很容易地在实例和位置之间使用地图,但是在某些时候,我仍然需要将所有位置放在一起进行渲染。如果我在这一点上遗漏了一些明显的东西,请让我知道。更换缓冲区似乎不会影响性能,但是当某些变化太慢时重建整个位置矢量。

希望这不是太多的文字墙..任何帮助将不胜感激。

改为使用“GLDrawElementsInstanced”,以便不需要更改平移向量(只对索引重新排序)。

更新:(真正的答案:)

绑定改造缓冲区(用所有的转化,包括不可见的情况下)为TBO,然后访问它作为着色器的纹理。为每个实例提供一个索引属性(glVertexAttribDivisor = 1),以用作从翻译纹理中获取的坐标。

这样您只需要修改索引缓冲区并将新的翻译附加到翻译缓冲区。在某些情况下,您可以通过删除未使用的值来执行转换缓冲区的清理过程。

+0

我知道使用它会比一般的复制顶点好,但我不知道这将如何帮助这种情况。你能详细说明一下吗?我使用“glVertexAttribDivisor”从每个实例向量传递一个翻译,所以我需要翻译向量来仅保存当前所需的翻译。然后将该翻译添加到顶点着色器内部的位置。当某些东西被删除并且添加了其他东西时,所使用的翻译不一定是相同的,但它可以被添加到完全不同的位置。 – John 2011-04-13 18:30:12

+0

@John。我明白你的意思。你需要实例的索引,但不是顶点......当然,不要在意我的答案,我会稍微考虑一下,稍后再编辑它。 – kvark 2011-04-13 19:27:19

+0

谢谢,我会给你一个镜头。似乎要好好保留一些看不见的东西,而不是最终会遇到一些过于复杂的算法。 – John 2011-04-13 21:38:49