为VBO创建动态对象数组

时间:2015-01-17 07:04:26

标签: c++ arrays opengl vbo dynamic-arrays

我正在尝试创建动态的对象数组,然后将其用于VBO。

Vector3f Vertices[] = new Vector3f[size];
/* 
    initialization
*/

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

但我有以下错误: initialization with '{...}' expected for aggregate object 那么,我该怎么做呢?我想这一定是可能的。

2 个答案:

答案 0 :(得分:1)

您可能需要使用std :: vector或std :: list代替传统的C数组。

这是一个参考

OpenGL: Using VBO with std::vector

答案 1 :(得分:0)

我以前的评论:在您对sizeof(Vector3f) * size的调用中,您需要sizeof(Vertices)而不是glBufferData,即数据的大小(以字节为单位)。


1 /。使用:Vector3f *vertices = new Vector3f[size];

vertices是一个Vector3f数组的指针(如果需要,在sizeof(Vector3f)}给出的元素之间有适当的填充。每个Vector3f元素都是使用Vector3f构造的默认构造函数。

2 /。考虑使用以下代码管理您的数据:std::vector<Vector3f> vertices (size); - 这样您就可以管理和操作vector容器而不是管理指针。由于std :: vector数据具有连续访问权限,因此您可以使用:

glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3f), vertices.data(), GL_STATIC_DRAW);

如果您更改顶点(Vector3f)容器的大小,则让std::vector<>::size()注意元素的数量。

显然,这里不需要任何明确的delete。一旦Vector3f容器超出范围,它就会被自动销毁。甚至没有涉及可以在容器上操作的通用功能的所有优点......合并,反转,排序......只是你可以免费获得的一些东西。