在 OpenGL 3+ 中有效地绘制多边形(每个多边形一种颜色)

Posted

技术标签:

【中文标题】在 OpenGL 3+ 中有效地绘制多边形(每个多边形一种颜色)【英文标题】:Efficiently draw polygons (one color per polygon) in OpenGL 3+ 【发布时间】:2015-04-15 12:38:37 【问题描述】:

在应用程序中,我必须绘制许多不相交的可变长度多边形。多边形之间的颜色不同,但单个多边形中的所有顶点将具有相同的颜色。如何有效地绘制它们?

我首先用相同的颜色绘制所有多边形。这很容易通过glMultiDrawArrays 和颜色统一来实现;例如(使用GL_LINE_LOOP 保持简单):

glUniform4f(shaderColourLocation, red, blue, green, alpha);
glMultiDrawArrays(GL_LINE_LOOP, pFirstIndices, pPolygonSizes, polygonCount);

这适用于我拥有的数据,但我可以看到添加每个多边形颜色的唯一方法是:

将其分解为多个 glDrawArrays 调用,每次都设置颜色(大量额外的 API 调用); 缓冲每个顶点的颜色数据(复制大量颜色数据); 缓冲多边形索引并使用统一的颜色数组(更复杂,还有一些冗余数据)。

有没有更好的方法来实现每个多边形的颜色,同时仍然使用glMultiDrawArrays 或类似的东西?

【问题讨论】:

不要害怕复制颜色数据。 【参考方案1】:

您想要实现的(每个多边形一种颜色)称为平面着色

您可能可以使用the flat qualifier 来调整着色器的宽度。

您还可以查看glShadeModel 参数,通过使用GL_FLAT 模式并巧妙地定义三角形的第一个顶点,您可以避免在缓冲区中复制数据。

您可以在 the OpenGl compatibility specs (p482 #507/953 §13.4) 中找到文档。

【讨论】:

行循环仍然会逐行查看要传递的属性,因此这并不能免除您将正确的颜色传递给顶点着色器的责任。 @ratchetfreak,你说得对,我的回答是关于多边形渲染。编辑了我的答案以强调这一点。【参考方案2】:

使用实例化属性


打电话

glVertexAttribDivisor(color_attrib_location, 1);

在初始化顶点数组时进行一次。

使用此设置,每个点/线/多边形只需要一份颜色值。

此外,您应该在着色器中为此属性使用 flat 插值限定符,但这不是必需的。

【讨论】:

实例化只会用相同的制服重绘相同的网格,并且只有在glVertexAttribDivisor中设置的属性在实例之间会有所不同。

以上是关于在 OpenGL 3+ 中有效地绘制多边形(每个多边形一种颜色)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL在多个地方多次绘制同一个多边形

用鼠标在 OpenGL GLUT 中绘制多边形

如何在OpenGL中将像素作为纹理绘制到多边形?

如何在 OpenGL 3.2 中绘制全屏四边形?

OpenGL VBO 绘制顺序

如何有效地绘制单点