【发布时间】:2014-06-05 14:50:21
【问题描述】:
我有一个子函数,它读取数据流并基于它创建一个顶点数据数组。主函数反复调用该子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到目前为止,一切都很好。但是,我不知道如何添加顶点。 C++ 不允许您重新分配或调整整个数组的大小。我不能使用向量,因为 OpenGL 函数接受的是数组,而不是向量。
【问题讨论】:
标签: c++ arrays opengl resize buffer
我有一个子函数,它读取数据流并基于它创建一个顶点数据数组。主函数反复调用该子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到目前为止,一切都很好。但是,我不知道如何添加顶点。 C++ 不允许您重新分配或调整整个数组的大小。我不能使用向量,因为 OpenGL 函数接受的是数组,而不是向量。
【问题讨论】:
标签: c++ arrays opengl resize buffer
您可以使用向量来填充 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);
微妙但关键的部分是您传入向量的第一个元素的地址,而不是向量对象的地址。
【讨论】:
我会稍作修改。虽然您可以使用 &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 数据。如果您知道大小,则很容易预先分配,并且当您添加项目时它们会增长(并保持连续)。它们很容易迭代。如果要传入交错数据,可以轻松创建结构向量。一切都一样。
【讨论】:
data() 方法,因为它仅在 C++11 中引入,而另一种方法适用于所有版本的 C++。无论如何,这看起来更像是评论而不是答案。