你好,我很难弄清楚为什么传递GLfloat位置数组(xyz)的第一个元素突然给缓冲区提供了该数组的所有元素。
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);在这里,数据的参数是&顶点,在调试期间只生成一个xyz向量,但是当整个对象呈现时,它肯定不能只有这个向量。
明智的做法是把整个向量&顶点传递给我,不是吗?
也许我误解了OpenGL缓冲区是如何工作的?
我一直在关注这里的教程:http://learnopengl.com/#!Model-Loading/Mesh
总结:为什么和顶点而不是&顶点
发布于 2016-10-25 19:45:29
我假设vertices是std::vector<Vertex>。因此,这意味着&vertices是std::vector<Vertex>*类型的,或者是指向向量的指针。
然而,OpenGL不需要向量。OpenGL是为C编写的,它没有向量的概念。因此,它需要一个C样式的数组.(如果您不确定这是什么,请参见这里。)
根据C++标准,std::vector必须将其所有元素存储在连续内存中。这意味着vertices[1]必须紧跟在vertices[0]之后,vertices[2]必须紧随vertices[1]之后,等等。这实际上就是C样式数组的本质:指向一组连续项的指针。
如果vertices[0]是向量的第一个元素,那么&vertices[0]就是指向第一个元素的指针。正如我前面所说的,所有元素都是连续存储的,所以&vertices[0]实际上只是一个指向C样式数组的指针。
在C++11中,您可以使用vertices.data(),这在本质上是一样的,但是更干净。
https://stackoverflow.com/questions/40248360
复制相似问题