我在教程中看到您可以直接用 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
做同样的事情吗? ?
最佳答案
我不习惯以这种方式使用 glm::vec3,因为我不记得看到过任何指定其内部布局的文档。在 type_ptr.hpp 中定义了一个 glm::value_ptr(obj) 助手这一事实让我更加怀疑。
就是说,您可以检查它的源代码并自己验证它是否恰好有 3 个 float 并且没有额外的字段,并且还可以在编译时检查 sizeof(glm::vec3) == 3*sizeof( float) 以防结构填充做任何有趣的事情。
粗略查看 QVector3D 的文档并没有显示任何内部存储器布局的指示。因此,与 glm::vec3 一样,您需要检查其源代码以验证 x、y、z 是否按照您期望的顺序排列,然后验证 sizeof(QVector3d) == sizeof(GLfloat) * 3。
另请记住,虽然它可能适用于您的特定编译器/平台,但如果尝试移植到其他平台,则 YMMV。或者就此而言,如果更新到任一库的新版本。
编辑:关于 OP 关于 POD 的评论,我认为这实际上不相关? “琐碎”和“标准布局”都不意味着类中没有额外的簿记字段,也没有任何关于填充的内容,而且我不确定您是否可以根据已发布的文档首先保证这两种分类。 trivial vs. standard layout vs. POD
关于c++ - 用 QVector<QVector3D> 填充 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23250160/