4

我遇到了一个问题,我不确定如何正确处理。我最近开始为我的游戏创建一个粒子系统,并且一直在为我的粒子数据使用一种名为“粒子”的结构。“粒子”包含用于渲染的顶点信息。

我遇到问题的原因是我将我的粒子结构汇集在堆内存中以节省大量分配,但是我不确定如何在 glBufferData 中使用指针数组,我的印象是 glBufferData 需要实际的结构实例而不是指向结构实例的指针。

我知道我可以重建一个浮点数组,每次渲染只是为了绘制我的粒子,但是是否有一个像 glBufferData 这样的 OpenGL 调用,我在某处丢失了它能够在遍历我提供的数据时取消引用我的指针?理想情况下,我希望避免为了复制数据而不得不遍历数组。

4

1 回答 1

3

我的印象是 glBufferData 需要实际的结构实例,而不是指向结构实例的指针。

正确的。在通过data参数glBufferData指向它的地址处有效地创建数据的平面副本。

当它通过我提供的数据时,我错过了能够取消引用我的指针的地方?

您正在考虑客户端顶点数组,这些是 OpenGL 最古老的功能之一。自 19 年前发布的 OpenGL-1.1 以来,它们就一直存在。

您只是使用缓冲区对象,即不调用glGenBuffers、glBindBuffer、glBufferData 并将您的客户端数据地址直接传递给glVertexPointer 或glVertexAttribPointer。

但是我强烈建议实际使用缓冲区对象。无论如何都必须将数据复制到 GPU 上,以便进行渲染。通过缓冲区对象执行此操作可以使 OpenGL 驱动程序更有效地工作。此外,从 OpenGL-4 开始,缓冲区对象的使用不再是可选的。

于 2013-01-16T09:09:45.470 回答