用 QVector <QVector3D>填充 VBO

Filling a VBO with QVector<QVector3D>

本文关键字:填充 VBO gt QVector3D lt QVector      更新时间:2023-10-16

我在一个教程中看到,您可以直接用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>做同样的事情。CCD_ 3可以代替CCD_。但QVector3Dglm::vec3都不是POD(如果我错了,请纠正我),而且glm::vec3在某种程度上起作用。这是标准行为吗?我可以试着用QVector3D做同样的事情吗?

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

也就是说,你可以检查它的源代码,自己验证它有3个浮点值,没有额外的字段,还可以在编译时检查sizeof(glm::vec3)==3*sizeof(float),以防结构填充有任何有趣的事情。

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

还要记住,虽然YMMV可能在您的特定编译器/平台上工作,但如果试图移植到其他平台,则YMMV。或者就这一点而言,如果更新到任一库的新版本。

编辑:关于OP上关于POD的评论,我认为这实际上并不相关?"琐碎"answers"标准布局"都不意味着类中没有用于记账的额外字段,也没有任何关于填充的内容,而且我不确定您是否能够首先根据发布的文档保证这两种分类。琐碎布局与标准布局与POD