繁体   English   中英

用QVector填充VBO <QVector3D>

[英]Filling a VBO with QVector<QVector3D>

我在一个教程中看到,您可以使用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做同样的QVector3D吗?

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

也就是说,您可以检查其源代码并亲自验证它是否恰好具有3个浮点并且没有多余的字段,还可以在编译时检查是否在其中sizeof(glm :: vec3)== 3 * sizeof(float) case struct padding做任何有趣的事情。

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

还请记住,尽管它可能在您的特定编译器/平台上运行,但如果尝试移植到其他平台,则可以使用YMMV。 或就此而言,如果更新到任一库的新版本。

编辑:关于OP关于POD的评论,我不认为这实际上相关吗? “平凡的”或“标准的布局”都不意味着该类中没有用于记账的多余字段,也没有任何关于填充的内容,而且我不确定您是否可以保证首先根据已发布的文档进行分类。 琐碎vs.标准布局vs.POD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM