我在一个教程中看到,您可以使用这样的std::vector<glm::vec3>直接填充VBO:
std::vector< glm::vec3 > vertices;
// fill the vector and create VBO
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);现在,我想知道我是否可以用QVector<QVector3D>来做同样的事情。QVector可以代替std::vector,因为它们的内存是连续的。但是QVector3D和glm::vec3都是非POD的(如果我错了,请纠正我),并且不知何故glm::vec3起作用了。这是标准行为吗?我能试着用QVector3D做同样的事吗?
发布于 2014-04-23 17:15:52
我不愿意以这种方式使用glm::vec3 3,因为我不记得有任何文档指定了它的内部布局。事实上,在glm::value_ptr(obj)中定义了一个type_ptr.hpp (Obj)助手,这使我更加怀疑。
尽管如此,您可以检查它的源代码,并自己验证它确实有3个浮动,没有额外的字段,还可以在编译时检查== 3的大小(glm::vec3),以防struct做任何有趣的事情。
粗略地查看一下QVector3D的文档不会显示任何内部内存布局的指示。因此,与glm::vec3 3一样,您需要检查其源代码,以验证x、y、z是否按您所期望的顺序排列,然后验证(QVector3d) == sizeof(GLfloat) *3的大小。
还请记住,虽然它可能工作在您的特定编译器/平台,YMMV,如果试图移植到其他平台。或者就这一点而言,如果更新到任何一个库的新版本。
编辑:关于OP上关于POD的评论,我不认为这实际上是相关的?“琐碎”和“标准布局”都不意味着类中没有额外的字段用于簿记,也没有任何关于填充的内容,而且我不确定您是否能够根据发布的文档首先保证这两种分类。trivial vs. standard layout vs. POD
https://stackoverflow.com/questions/23250160
复制相似问题