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

| 我很可能会以错误的方式进行操作,但是我想知道是否有人对如何跟踪向量中非唯一元素的位置提出了一些建议? 我正在使用glDrawArraysInstanced并使用向量来存储偏移特定实例位置的转换(即第一个元素是x转换,第二个y,第三个z重复)。将此向量放入缓冲区,绘图通过使用实例化按预期工作,并具有良好的性能提升。我不想基于gl_InstanceID设置位置,因为ID会根据绘制的实例数而变化,但是我需要使实例保持一致。 尝试使实例数动态化时会出现问题。我需要能够有效地添加和删除向量中的元素,而不必每次发生更改时都重新构建整个向量。我不确定如何确定翻译在向量中的确切位置。 举个例子: 实例0使用转换0,1,2 实例1使用翻译3、4、5 实例2使用翻译6,7,8 要删除实例1: 首次构建翻译时,我可以存储翻译的x分量的索引,所以我知道我需要从3开始擦除3个元素。 要删除实例2: 我怎么知道这个实例的起始索引是什么?在构造期间存储的索引不再有效。 我知道这种情况是微不足道的,我可以从初始存储的索引中减去,但是如果我说有40,000个实例,那么有一种有效的方法可以始终知道该实例的特定翻译在向量中的位置吗?在实例的几次添加/删除之后,索引可能会在合理的范围内变化。 注意:我要使用向量,因为OpenGL需要float *来填充缓冲区。我可以轻松地在实例及其位置之间使用地图,但是在某个时候,我仍然需要将所有位置放在一起进行渲染。如果在这一点上我遗漏了一些明显的东西,请告诉我。交换缓冲区似乎并不会对性能产生太大影响,但是当发生某些变化时重建整个位置向量太慢了。 希望这不是太多的文字墙..任何帮助将不胜感激。     
已邀请:
使用\“ GLDrawElementsInstanced \”代替,这样就无需更改转换向量(只需对索引重新排序)。 更新:(真实答案:) 将转换缓冲区(包括不可见实例的所有转换)绑定为TBO,然后在着色器中将其作为纹理进行访问。为每个实例提供一个索引属性(glVertexAttribDivisor = 1),用作从翻译纹理中获取的坐标。 这样,您将只需要修改索引缓冲区并将新的翻译附加到翻译缓冲区。在某些时候,您可以通过删除未使用的值来执行转换缓冲区的清理过程。     

要回复问题请先登录注册