c++ - 用 QVector<QVector3D> 填充 VBO

标签 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 做同样的事情吗? ?

最佳答案

我不习惯以这种方式使用 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/

相关文章:

c++ - Boost C++ 中的索引子集迭代器

c++ - QLibrary 函数在第一次调用时运行缓慢

c++ - 将Qt qml文件转换为位图图像

c++ - 逐步将 Delphi 移植到 C++

c++ - gluProject 和 glhProject 之间有什么区别?

c++ - 具有可分离程序的 OpenGL 统一 block 绑定(bind)

c++ - 如何扩展分配的命名空间

c++ - 我是否必须重写一个函数才能在 QT 中工作?

sorting - 在 glsl 中构建一种像素排序

c++ - 字符数组问题