因此,OpenGL编程的一个关键要求是以一种保证连续内存的方式存储顶点。我最近读过专业图形程序员的几本不错的书,他们都使用了相同想法的变体:将顶点打包成struct
3 floats
,x,y,z和然后将多个顶点打包成c样式数组或这些std::vector
的{{1}}。它有效。
但是我已经看到它在这个网站上一次又一次地说structs
并不保证内存连续性。有人说,如果你的结构包含所有struct
,那么它们可能是连续的,但不能保证。 floats
和{ {1}}确保它,但如果您放入数组或向量中的内容不是连续的,则无关紧要。
对于生产代码,我希望“可能”不会削减它。因此,尽管这两本书明显更适合学习,但我想知道还有哪些其他优秀的技术可以轻松地以保证连续内存的方式组织顶点数据,或者,我接受我不应该担心的建议,可能应该足够好。
图形领域中使用的其他常用和好方法是什么?
答案 0 :(得分:5)
因此,OpenGL编程的一个关键要求是以一种保证连续内存的方式存储顶点。
不,不是真的。连续的内存可以节省空间,但只要属性之间的步幅(以字节为单位)在所有元素之间相同,这个就可以了。
图形领域中使用的其他常用和好方法是什么?
原始数据类型的简单,简单,平面数组,如std::vector<float>
或std::vector<char>
,如果您只想要一块内存,您可以手动分散数据。你可以使用getter和setter方法以及抽象偏移和步幅计算的迭代器接口很好地将它包装在一个类中。
如果可以使用编译器扩展来指定其内存布局,也可以使用结构。例如,GCC的__attribute__((packed))
将构成元素的紧密结构,而无间隙。
答案 1 :(得分:2)
OpenGL Mathematics Library,glm
,保证其向量在内存中是连续且简单的,我个人用它来存储顶点:
std::vector<glm::vec3> positions;
std::vector<glm::vec2> texCoords;
它还有一个实用程序,可以在OpenGL glXXXv
函数中安全地转换其结构的地址。
如果你想在一个VBO中拥有所有东西,你必须创建某种复合结构,因为我害怕std::tuple<glm::vec3, glm::vec2>
is not up for the challenge,这有点让人伤心。
看起来,the glm behaviour is not backed by the standard,可能已经改变了C ++ 11和alignas()
。但是,我猜你在对齐结构方面几乎没有做得更好,建议的static_assert
应该可以防止你在脚下射击。