您好我无法弄清楚为什么传递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
答案 0 :(得分:3)
我假设vertices
是std::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()
,这本质上是相同但更清晰。