我想知道如何有效地从 webgl 属性缓冲区中间删除三角形。
我想到的第一个解决方案是重新缓冲从中间到末尾的所有数据,将所有数据移回原位。对于只想删除单个三角形来说,这似乎效率很低。
我想到的第二个解决方案是添加一个附加属性来跟踪三角形是否被删除,如果是,则将其移到顶点着色器中的平截头体之外以进行剔除。这会增加内存开销,我想您会想要跟踪被删除的三角形,以便重用这些内存块。
我想第三种方法是获取缓冲区中的最后一个三角形并将其移动到被删除的三角形的位置,然后减少要绘制的三角形的数量。
有没有通用的方法来解决这个问题?
最简单也可能是最常见的解决方案是操纵缓冲区。将缓冲区的最后一个三角形移动到要删除的三角形的位置并少渲染 1 个三角形可能是最有效的解决方案。或者,只需将三角形的第二个和第三个点的顶点坐标更改为等于第一个点。
2 个(或全部 3 个)点相等的三角形基元根本不会渲染。您不必更新整个缓冲区,因为您可以bufferSubData仅更改这两个顶点属性。如果一个顶点由 3 个浮点组成,则意味着仅更改 24 个字节。
如果使用索引缓冲区 ( ELEMENT_ARRAY_BUFFER),解决方案就更简单。您只需使三角形的 3 个索引相等或用最后一个三角形的索引替换这些索引即可。
无论你决定什么,你总是必须确保你只需要做一次。更改缓冲区一次并每帧渲染更新的缓冲区。这对性能的影响最小。