OpenGL -添加顶点

OpenGL - add vertices

本文关键字:顶点 添加 OpenGL      更新时间:2023-10-16

我有一个子函数,读取数据流并创建基于该顶点数据的数组。主函数反复调用此子函数并更新顶点数据数组,然后将其绑定到缓冲区并绘制。到目前为止,一切顺利。然而,我不知道如何添加顶点。c++不允许重新分配或调整整个数组的大小。我不能使用向量,因为OpenGL函数接受数组,而不是向量。

你可以使用矢量填充OpenGL顶点缓冲区。保证vector中的值是连续的。有关相关语言标准的详细信息,请参见以下讨论:

  • std::vector元素是否保证连续?
  • 假设STL向量存储总是连续的是安全的吗?
这意味着像下面这样的代码是安全的:
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);
传递的是vector 第一个元素的地址,而不是vector对象的地址。

我会做一个小小的编辑。虽然您可以使用&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);

我对OGL数据使用STL向量有很多原因。如果您知道大小,则很容易预先分配,并且在添加项时它们会增长(并保持连续)。它们很容易迭代。如果你想传递交错的数据,你可以很容易地创建结构向量。都是一样的