【问题标题】:OpenGl handling lots of vertexesOpenGL处理​​大量顶点
【发布时间】:2016-03-15 16:33:26
【问题描述】:

我有渲染模型的代码,但是如果我使用了太多顶点,我会遇到一个问题:程序无法分配足够的内存来处理所有顶点。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
 glVertexPointer(3,GL_FLOAT,0,VertexArray);
 glNormalPointer(GL_FLOAT,0,NormalArray);
 glColorPointer(3,GL_FLOAT,0,ColorArray);

这是我的代码,它只是其中的一部分,但我想够了。 VertexArray 是通过 new 操作符得到的,它是一个数组的指针。但是如果我使用长度数组,例如10000000 个值我得到一个错误。

有没有办法从 RAM 的不同部分分配内存?或者有什么其他方法可以找到解决办法?

【问题讨论】:

  • 这些数组从何而来?
  • @nicol-bolas 来自体素八叉树。它是立方体顶点
  • 我的意思更多的是一般他们来自哪里。向我们展示他们的声明。如果您在堆上分配它们,让我们看看这些分配。另外,你得到什么样的错误,你从哪里得到的?究竟是什么错误?给我们一个minimal reproducible example

标签: c++ opengl 3d


【解决方案1】:

如果您正在绘制在第一次调用后不会经常修改的模型,您可以切换到使用 VBOs 并使用 STATIC_DRAW 标志,这很可能会告诉您的 GPU 将它们放入视频内存中,您将拥有如果您将一些 VBO 用于不需要不断更改/在 CPU 上轻松访问所有顶点数据的模型,则更明智的呼吸空间内存。 (即使没有,也有办法访问该顶点数据并进行更新,例如 glBufferSubData,并改用 DYNAMIC_DRAW 标志)。

VBO 存储在 GPU 内存中,而不是系统内存中,从而在您开始达到内存上限之前为您提供更多容量。

旧的 glVertexPointer 方法没有这个好处。

【讨论】:

  • 对不起,不明白。 “VBO 存储在 GPU 内存中,而不是系统内存中,为您提供更多容量”。什么? GPU内存比RAM大吗?这不是真的……
  • 顺便说一句,我正在编写体素编辑器(3d 模型编辑器),所以我的对象正在改变。
  • 不,但您不必将这些对象的顶点信息保存在 RAM 中,您只需存储一些有关模型在 GPU 上的位置的信息(VAO)。您可以生成顶点缓冲区对象(用于存储所有模型信息、顶点位置、法线、tex-coords,每个顶点的任何内容都可以使用顶点属性指针来描述)并且您可以调用以使用 glDrawArrays 或 glDrawElements 而不是绘制模型需要调用 glVertexPointer,并带有指向存储在 RAM 中的某个顶点位置数组的指针。
  • 看看我引用的链接中的 VBO 和 VAO 的使用,您将节省大量内存。如果您有多次绘制的重复对象(即,如果您正在使用体素编辑器,则为“立方体”),您还可以通过使用实例化进一步减少所需的内存量。因此,您只需将一个“立方体”对象存储在 GPU 内存中,您就可以存储它的许多实例的坐标或原点。这将为您节省大量内存,您当前必须使用这些内存来存储系统内存/RAM 上的所有顶点位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多