OpenGL和STL是什么?

6
我正在使用OpenGL,并且目前正在传递一个顶点数组。问题在于,我必须创建许多顶点,并在它们之间添加(为了排序)。这意味着使用常规数组非常麻烦/低效。
我想使用STL中的数据结构,以便可以有效地(并且轻松地)将新的顶点放在任何索引处。问题是OpenGL需要一个常规数组。
有人知道如何解决这个问题吗?是否有一种简单的方法将STL向量转换为数组?
我正在使用OpenGL 1.1
谢谢
4个回答

15

您可以使用指向向量第一个地址的指针作为数组指针。STL向量保证将其元素保存在连续内存中,因此您可以执行以下操作:

&vertices[0]

其中vertices是你的向量。


3

OpenGL需要一个连续的元素数组。由于一些明显的原因,插入单个元素到连续的数组中没有高效的方法。这必须至少是O(N)。

然而,你可能可以在比vector对N个随机插入所需的O(N^2)更短的时间内添加N个元素。

例如,如果你实际上不是在“任何索引”处添加新的顶点,而是总是靠近前一个顶点,则可以将所有元素添加到std :: list中(每个元素为O(1),总共为O(N)),然后将std :: list复制到std :: vector中。实际上,它不必是the前一个元素,只要是a前一个元素,因此如果顺序基于对某个树的递归遍历,则仍然可以这样做。

如果新的顶点是按一些线性顺序确定的索引添加的,则将所有元素添加到std :: map或std :: multi_map中(每个元素为O(log N),总共为O(N log N)),然后将其复制到vector中。

因此,最低复杂度的方法取决于如何确定顺序。这些较低复杂度的解决方案是否实际上比vector 更快取决于N。它们有更高的开销(分配O(N)而不是vector的O(log N)),因此在渐近行为发生之前,N可能必须非常大。

如果你使用我描述的任何一种解决方案,则将list或map复制到vector的简单/高效方法如下:

std::vector<glVertex3f> vec;
vec.reserve(listormap.size());
vec.insert(vec.begin(), listormap.begin(), listormap.end());

1
vector<int> array;
.....
functionThatAcceptsArray(&array[0]); // yes, this is standard

1

这取决于您对中间数据表示的控制程度以及您能够预先计算多少。为了在自由和内存使用之间达成妥协,请阅读关于 Winged Edge数据结构的内容。该结构允许快速访问和遍历顶点、边缘和面,并且像双向链表一样工作。如果您实现了该概念并为其实现了迭代器,您可以使用std::copy将数据复制到任何STL容器中。
正如其他人已经提到的那样,在OpenGL需要数据时,请使用std::vector作为最终表示。最后:
不要害怕拥有相同数据的多个实例!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接