OpenGL - 添加顶点

时间:2014-06-04 22:29:41

标签: c++ arrays opengl resize buffer

我有一个子函数,它读取数据流并根据它创建一个顶点数据数组。 main函数重复调用此子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到现在为止还挺好。但是,我无法弄清楚如何添加顶点。 C ++不允许您重新分配或调整整个数组的大小。我不能使用向量,因为OpenGL函数接受数组,而不是向量。

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

我会做一个小编辑。虽然你可以使用&amp; vertexPositions [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数据。如果您知道尺寸,则很容易预分配,并且当您添加项目时它们会增长(并保持连续)。它们很容易迭代。如果要传递交错数据,可以轻松创建结构向量。这一切都是一样的。