在 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+ 中有效地绘制多边形(每个多边形一种颜色)的主要内容,如果未能解决你的问题,请参考以下文章