为 VBO 创建动态对象数组

Posted

技术标签:

【中文标题】为 VBO 创建动态对象数组【英文标题】:Create dynamic array of objects for VBO 【发布时间】:2015-01-17 07:04:25 【问题描述】:

我正在尝试创建对象的动态数组,然后将其用于 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 那么,我该怎么做呢?我想这一定是可能的。

【问题讨论】:

【参考方案1】:

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

这是一个参考

OpenGL: Using VBO with std::vector

【讨论】:

【参考方案2】:

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


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 容器超出范围,它就会自动销毁。甚至没有触及可以在容器上操作的通用函数的所有优势...合并、反转、排序...只是您免费获得的一些东西。

【讨论】:

@user3051029 - 如果满意,请随时接受答案。如果您还不知道,当您设置VertexAttribPointer 并且Vector3f 元素之间有填充时,您可能需要小心“步幅”。例如,glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, sizeof(Vector3f), (void *) 0); - 除非您知道数据已打包。

以上是关于为 VBO 创建动态对象数组的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

绑定到“顶点数组对象”后,我应该删除“顶点缓冲区对象”吗?

OpenGL中的动态VBO

OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

VBO:未绘制数组

我的OpenGL学习进阶之旅介绍 顶点数组对象VAO并实战一下