C++ 用QVector填充VBO<;QVector3D>;
我在一个教程中看到,可以用C++ 用QVector填充VBO<;QVector3D>;,c++,qt,opengl,glm-math,C++,Qt,Opengl,Glm Math,我在一个教程中看到,可以用std::vector直接填充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); std::vector顶点; //填充向量并创建VBO glBuff
std::vector
直接填充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);
std::vector顶点;
//填充向量并创建VBO
glBufferData(GL\u数组\u缓冲区,顶点.size()*sizeof(glm::vec3),&顶点[0],GL\u静态\u绘制);
现在我想知道我是否可以用
QVector
做同样的事情QVector
可以替换std::vector
,因为它们的内存是连续的。但是QVector3D
和glm::vec3
都是非POD(如果我错了,请纠正我),而且glm::vec3
在某种程度上起作用。这是标准行为吗?我可以试着用QVector3D
做同样的事情吗?我不习惯用这种方式使用glm::vec3,因为我不记得看到过任何指定其内部布局的文档。在类型_ptr.hpp中定义了一个glm::value_ptr(obj)helper,这一事实让我更加怀疑
这就是说,您可以检查它的源代码,亲自验证它是否有3个浮点值,并且没有额外的字段,还可以在编译时检查sizeof(glm::vec3)==3*sizeof(float),以防结构填充做了任何有趣的事情
粗略地看一下QVector3D的文档并没有显示内部内存布局的任何指示。因此,正如glm::vec3一样,您需要检查其源代码,以验证x、y、z是否按照您期望的顺序排列,然后验证sizeof(QVector3d)==sizeof(GLfloat)*3
还请记住,虽然它可能在您特定的编译器/平台上工作,但如果尝试移植到其他平台,则YMMV可能会失效。或者,如果更新到任何一个库的新版本
编辑:关于《凤凰社》关于POD的评论,我不认为这有什么关系?“琐碎”和“标准布局”都不意味着类中没有用于记账的额外字段,也不意味着任何关于填充的内容,而且我不确定您是否能够首先根据已发布的文档保证这两种分类。
我害怕UB会杀了我的猫…:我知道。但有时为了更大的利益必须牺牲猫:)
glm::vec3
使用float
类型,QVector3D
也使用float
。它应该很好用。我认为C++11再次实现了这两种类型。我检查了QVector3D标题,似乎x、y、z布局是正确的。而sizeof(QVector3D)是12(3*4)。但如果它不可移植,我似乎不会使用它。我在生产中使用了QVector
.data()作为3nfloat
s的缓冲区。我静态断言sizeof(QVector3D)==3*sizeof(float)
,与alignof
相同,并且我还有一个单元测试,检查QVector3D
的元素是否在对象内。(这可能是在静态断言中使用constexpr
现在就可以实现的。。。