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