c++ - 在 OpenGL 3+ 中高效绘制多边形(每个多边形一种颜色)

标签 c++ opengl opengl-3

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

我首先用相同的颜色绘制所有多边形。使用 glMultiDrawArrays 和颜色统一很容易做到这一点;例如(使用 GL_LINE_LOOP 让事情变得简单):

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

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

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

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

最佳答案

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

您可能可以通过使用 the flat qualifier 来调整着色器宽度.

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

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

关于c++ - 在 OpenGL 3+ 中高效绘制多边形(每个多边形一种颜色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650466/

相关文章:

c++ - OpenGL找不到一些统一变量

c++ - 为什么程序运行时我的第二个循环不执行?

opengl - 非单调深度缓冲区; OpenGL 中的循环重叠

opengl - opengl 3.3 后处理效果的高效下采样

c - 在特定顶点上使用 glLoadMatrixd ?

c++ - 取消设置 glXMakeContextCurrent 时进程崩溃

c++ - 无法获取索引缓冲区以在 OpenGL 中绘制正方形

c++ - 给定一个 uint8_t,找出设置了多少位

c++ - 在类中访问枚举时出错

c++ - opencv Mat重新分配内存损坏