2014-06-04 85 views
0

我有一个子功能,它读取数据流并基于此创建一个顶点数据数组。主函数重复调用该子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到现在为止还挺好。但是,我不知道如何添加顶点。 C++不会让您重新分配或调整整个数组的大小。我不能使用矢量,因为OpenGL函数需要数组,而不是矢量。OpenGL - 添加顶点

回答

3

您可以使用矢量来填充OpenGL顶点缓冲区。 vector中的值保证是连续的。见例如,对于细节这些讨论对相关语言标准:

这意味着类似下面的代码是安全的:

std::vector<GLfloat> vertexPositions; 
// Populate vector with vertex positions. 
GLuint bufId = 0; 
glGenBuffers(1, &bufId); 
glBindBuffer(GL_ARRAY_BUFFER, bufId); 
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), 
      &vertexPositions[0], GL_STATIC_DRAW); 

微妙但关键部分是你传递的地址的第一个元素矢量,而不是矢量对象的地址。

+0

有趣。来自Java背景,我没有立即识别矢量 - >指针<->数组路径。谢谢。 – user2258552

1

我会稍作修改。虽然可以使用顶点位置[0]作为STL向量的开头地址,但我更喜欢使用设计用于返回向量内存开始地址vertexPositions.data()的函数。

std::vector<GLfloat> vertexPositions; 
// Populate vector with vertex positions. 
GLuint bufId = 0; 
glGenBuffers(1, &bufId); 
glBindBuffer(GL_ARRAY_BUFFER, bufId); 
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), vertexPositions.data(), GL_STATIC_DRAW); 

由于许多原因,我使用STL向量来处理OGL数据。如果知道尺寸,预先分配很容易,添加项目时它们会增长(并保持连续)。它们很容易遍历。如果您想传递交错数据,您可以轻松创建结构向量。这一切都是一样的。

+0

我没有在答案中使用'data()'方法,因为它只在C++ 11中引入,而另一种方法适用于所有版本的C++。无论如何,这看起来更像是评论而非答案。 –