OpenGL VBO 绘制顺序

Posted

技术标签:

【中文标题】OpenGL VBO 绘制顺序【英文标题】:OpenGL VBO painting order 【发布时间】:2011-12-04 06:55:46 【问题描述】:

我打算使用 VBO 来显示一个大的点数组,大约 512x512。为了显示它,每个顶点都依赖于它最近的邻居。例如,如果我有下表:

[ 1, 2, 3, 5, 6, 7
  8, 9,10,11,12,13,
 14,15,16,17,18,19]

我想使用第 5 个点绘制一个多边形,我将不得不使用以下代码:

glBegin(GL_TRIANGLE_STRIP)
glVertex(Points5)
glVertex(Points6)
glVertex(Points11)
glVertex(Points12)
glEnd()

对于任何其他点等等..

我知道在任何给定时刻我的缓冲区都只能容纳 512x512 点,但我如何“教”它使用 GL_TRIANGLE_STRIP 和 VBO 以特定方式绘制?

【问题讨论】:

您在this answer 的cmets 中的讨论是否让您感到困惑? Datenwolf 已经告诉过您不要这样做“将每个都画成单独的条带”。这可能就是您在立即模式下表现不佳的原因。 Nicol Bolas:好吧,我找不到在给定代码(您的链接)中指定绘画方式的部分,如上面的 glVertex 示例所示 【参考方案1】:

我认为最好的解决方案是使用索引 (GL_ELEMENT_ARRAY_BUFFER) 缓冲区以索引的形式表达基元。 ref.

编辑:

我无法从您的问题中看出,但您可能想研究退化三角形带(添加退化三角形)以避免过多的绘制调用。

【讨论】:

虽然退化的三角形条带可能需要研究,但绝对不是针对每个单独的四边形,就像他现在想做的那样。 感谢您的回答,另一个问题是,在运行时,我首先单独计算每个点(CUDA),然后,在绘画(glVertex)过程中,我必须重建我的整个数据数组结构所以它将保持二次绘画风格(每次在当前点上添加 3 个附加点 - 从绘画风格中查看我的问题)?它不会变慢吗?因为我首先必须重新排列点然后绘制它们。【参考方案2】:

首先不要为每个单独的四边形绘制单独的三角形条!就像 Brett Hale 建议的那样,只需将这些四边形中的每一个拆分为两个三角形,并将这些三角形的所有顶点索引放入一个索引数组/缓冲区中。这样您就可以通过调用glDrawElements(GL_TRIANGLES, ...) 来绘制整个网格。

如果您不知道索引数组是什么或顶点数组/缓冲区通常是什么,那么您应该更深入地研究这个主题。但无论如何,请远离您当前为每个四边形绘制单个条带的解决方案。一开始听起来可能很棒(关于要发送的顶点数量),但事实并非如此。请记住,VBO 的优势不仅在于可能的 GPU 存储,还在于您不需要为每个单独的基元调用驱动程序,而您当前的解决方案只能这样做。

您也可以使用GL_QUADS 代替GL_TRIANGLES。这样,每个四边形仍然只需要 4 个索引(相比之下,使用三角形时需要 6 个索引),并且仍然可以在一次调用中绘制它。但请记住,GL_QUADS 已从较新的 OpenGL 版本(3+)和 ES 的核心配置文件中删除。所以GL_TRIANGLES 可能是一个更便携的解决方案(GPU 无论如何都会把它分成三角形)。

【讨论】:

以上是关于OpenGL VBO 绘制顺序的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 绘制列表转换为顶点数组或 VBO

使用 OpenGL VBO 绘制数千个多边形

OpenGL - 绘制存储在 VBO 中的大量信息

OpenGL:尝试使用 VBO(顶点缓冲区对象)绘制线条,它不显示

使用 VAO 在 OpenGL 中更改绘制的实例化顺序

VBO绑定的OpenGL顺序