OpenGL glBufferData - >为什么& vertices [0]而不是& vertices作为数据参数?

时间:2016-10-25 19:41:03

标签: c++ opengl

您好我无法弄清楚为什么传递GLfloat位置数组的第一个元素(xyz)会突然给缓冲区提供该数组的所有元素。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

这里数据的参数是& vertices [0] ,它在调试过程中只产生一个xyz向量,但是当整个对象被渲染时,它肯定只能有这个向量。

理智的做法是将整个矢量& vertices 传递给我的脑海,不是吗?

也许我对OpenGL缓冲区如何工作有误解?

我一直在关注这里的教程:http://learnopengl.com/#!Model-Loading/Mesh

总结:为什么& vertices [0]而不是& vertices

1 个答案:

答案 0 :(得分:3)

我假设verticesstd::vector<Vertex>。既然如此,那意味着&vertices的类型为std::vector<Vertex>*,或者是指向向量的指针。

然而,OpenGL并不需要矢量。 OpenGL是为C编写的,它没有向量的概念。因此,它需要一个C风格的数组。 (如果您不确定是什么,请参阅here。)

根据C ++标准,std::vector必须将其所有元素存储在连续内存中。这意味着vertices[1]必须在vertices[0]之后,vertices[2]vertices[1]之后,等等。这基本上就是C风格的数组:指向一组连续项的指针。

如果vertices[0]是向量的第一个元素,则&vertices[0]是指向第一个元素的指针。就像我上面说的那样,所有元素都是连续存储的,所以&vertices[0]实际上只是指向C风格数组的指针。

在C ++ 11中,您可以改为使用vertices.data(),这本质上是相同但更清晰。