5

因此,OpenGL 编程的一个关键要求是您以保证连续内存的方式存储顶点。我最近读了几本专业图形程序员写的不错的书,他们都使用了相同想法的变体:将顶点打包struct为 3的 a floats,x,y,z,然后将多个顶点打包为 c 样式数组或std::vector这些structs。它有效。

但是我在这个网站上一次又一次地看到它说 astruct不能保证内存连续性。有人说,如果您的结构包含所有内容,floats那么它们可能是连续的,但不能保证。 并且确实保证了这一点,但是如果您放入数组或向量中的内容不连续,那就无关紧要了arraystd::vector

对于生产代码,我希望“可能”不会削减它。因此,尽管这两本书中的建议显然更适合学习,但我想知道还有哪些其他好的技术可以以保证连续内存的方式轻松组织顶点数据,或者,我会接受建议我不应该担心这个,这可能已经足够好了。

图形领域还有哪些常用的好方法?

4

2 回答 2

5

因此,OpenGL 编程的一个关键要求是您以保证连续内存的方式存储顶点。

不,真的。连续内存节省空间,但只要属性之间的步幅(以字节为单位的距离)在所有元素之间相同,这个东西就可以工作。

图形领域还有哪些常用的好方法?

简单、普通、平面的原始数据类型数组,例如std::vector<float>,或者std::vector<char>如果您只想要一块内存,您可以在其中手动连续地分散数据。您可以使用 getter 和 setter 方法以及抽象偏移量和步幅计算的迭代器接口很好地将其包装在一个类中。

如果您可以使用编译器扩展来指定其内存布局,您也可以使用结构。例如,GCC__attribute__((packed))将使元素的结构紧密,之间没有间隙。

于 2013-04-12T01:25:03.590 回答
2

OpenGL 数学库glm,保证它的向量在内存中是连续且简单的,我个人用它来存储顶点:

std::vector<glm::vec3> positions;
std::vector<glm::vec2> texCoords;

它还具有一个实用程序,可以在 OpenGLglXXXv函数中安全地转换其结构的地址。

如果您想在一个 VBO 中拥有所有内容,则必须创建某种复合结构,因为恐怕这std::tuple<glm::vec3, glm::vec2> 无法应对挑战,这有点令人难过。


看起来,glm 行为不受标准的支持,尽管 C++11 可能已经改变了alignas()。但是,我想,在对齐结构方面几乎不可能做得更好,并且建议static_assert应该可以防止你在脚下开枪。

于 2013-04-12T10:05:47.477 回答