Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用QVector填充VBO<;QVector3D>;_C++_Qt_Opengl_Glm Math - Fatal编程技术网

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()作为3n
float
s的缓冲区。我静态断言
sizeof(QVector3D)==3*sizeof(float)
,与
alignof
相同,并且我还有一个单元测试,检查
QVector3D
的元素是否在对象内。(这可能是在
静态断言中使用
constexpr
现在就可以实现的。。。