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

时间:2015-04-15 12:38:38

标签: c++ opengl opengl-3

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

我开始绘制所有颜色相同的多边形。这很容易用glMultiDrawArrays和颜色制服;例如(使用GL_LINE_LOOP来保持简单):

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

这与我的数据配合得很好,但我可以看到添加每个多边形颜色的唯一方法是:

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

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

2 个答案:

答案 0 :(得分:1)

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

您可以使用the flat qualifier来设置着色器的宽度。

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

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

答案 1 :(得分:0)

使用 实例化属性


呼叫

glVertexAttribDivisor(color_attrib_location, 1);

初始化顶点数组时。

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


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