【问题标题】:Batching GL_POLYGON using vertex arrays in OpenGL在 OpenGL 中使用顶点数组对 GL_POLYGON 进行批处理
【发布时间】:2012-08-20 12:00:13
【问题描述】:

我有一堆 GL_POLYGONS 我需要使用顶点数组(放入顶点缓冲区对象)进行渲染。

我正在使用索引和 glDrawElements()。

我知道您可以使用冗余顶点对 GL_TRIANGLE_STRIPS 进行批处理,以便在渲染过程中将它们链接起来。

GL_POLYGON 是否可以实现类似的功能?

如果可能,我想避免在循环中调用 glDrawElements(),为每个多边形指定索引。

(这不适用于 OpenGL ES - 我在笔记本电脑上使用 OpenGL。)

编辑#1:

我想在这里补充一下蒂姆在下面的答案(原始重启)有效,但您需要记住启用此模式 - 我花了一段时间才弄清楚。即:

// enable primitive restart
glEnable(GL_PRIMITIVE_RESTART);

【问题讨论】:

  • 虽然蒂姆的回答是正确的,但作为一般建议,不要乱用多边形,它们只是垃圾(从人们认为三角形以外的东西实际上可以理解的日子开始)。它们无论如何都需要是凸的,因此通常只实现为GL_TRIANGLE_FAN。而这反过来又可以用GL_TRIANGLES 的列表来表示,这消除了退化顶点和重新启动的任何需要。 GL_QUADSGL_POLYGON 已被弃用是有原因的,没有人关心非三角形。尽管带有GL_TRIANGLE_FAN 的primitive_restart 可能是一种选择。
  • 这个建议并不总是实用的。就我而言,我需要支持一种几何格式,该格式可以具有 N 边的多边形 - 凸面、非凸面和带孔。我对非凸多边形进行了镶嵌——也许我也需要对凸多边形进行镶嵌。

标签: opengl


【解决方案1】:

如果您想通过一次绘制调用绘制多个多边形,您可以使用glMultiDrawElements。您只需传入一个指向索引的指针数组。

或者,如果您的目标是更高版本的 OpenGL,您可以使用名为 glPrimitiveRestartIndex 的东西,它允许您指定重新启动当前图元的特殊索引值。因此,您可以定义一个“特殊”索引,然后每当您将该索引插入数组时,多边形将使用下一个索引重新开始。不过,这只是 OpenGL 3+ 中的核心。

【讨论】:

  • glPrimitiveRestartIndex 是一个很好的建议,但不幸的是它对我没有任何影响。索引已正确填充,使用 65535 作为“分隔符”,我在 glDrawElements 之前调用此方法。但是多边形都连接起来了……
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
相关资源
最近更新 更多