使用QVector <qvector3d> </qvector3d>填充VBO

时间:2014-04-23 16:25:50

标签: c++ qt opengl glm-math

我在教程中看到你可以用这样的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,因为内存在两者中都是连续的。但是QVector3Dglm::vec3都是非POD(如果我错了,请纠正我)并且不知何故glm::vec3有效。这是标准行为吗?我可以尝试对QVector3D执行相同操作吗?

1 个答案:

答案 0 :(得分:1)

我不习惯以这种方式使用glm :: vec3,因为我不记得看到任何文档指定其内部布局。在type_ptr.hpp中定义了一个glm :: value_ptr(obj)帮助器的事实让我更加怀疑。

也就是说,您可以检查其源代码并自行验证它有3个浮点数并且没有额外的字段,并且还在编译时检查sizeof(glm :: vec3)== 3 * sizeof(如果struct padding做了任何有趣的事情,那么就可以了。

粗略查看QVector3D的文档并未显示内部存储器布局的任何指示。因此,就像使用glm :: vec3一样,您需要检查其源代码以验证x,y,z是否按照您期望的顺序排列,然后验证sizeof(QVector3d)== sizeof(GLfloat)* 3。

另请注意,虽然它可能适用于您的特定编译器/平台,但如果尝试移植到其他平台,则可以使用YMMV。或者就此而言,如果要更新到任一库的新版本。

编辑:关于OP关于POD的评论,我不认为这实际上是相关的吗?既不平凡也不琐碎。也没有&#39;标准布局&#39;意味着课堂上没有额外的字段用于簿记,也没有关于填充的任何内容,我不确定你是否可以根据已发布的文档首先保证分类。 trivial vs. standard layout vs. POD