在OpenGL中绘制一个凹多边形

我需要在OpenGL中绘制一个凹多边形。
多边形被定义为形成其外环的点的列表,以及定义其内环(排除区)的列表的列表。

我已经可以处理禁区了,所以如何绘制一个没有内环的多边形的解决scheme也不错。

Boost.Geometry的解决scheme将会很好,因为我已经在我的应用程序中大量使用它。

我需要这个在iPhone上工作,即OpenGL ES(带有固定pipe道的旧版本)。

我怎样才能做到这一点?

尝试OpenGL的细分设施 。 您可以使用它来将一个复杂的多边形转换成一组三angular形,您可以直接渲染。

编辑 (回应评论):OpenGL ES不支持细分function。 在这种情况下,如果多边形是静态数据,则可以在桌面或笔记本电脑上使用OpenGL离线生成镶嵌细分。

如果形状是dynamic的,那么用OpenGL ES就会失败。 然而,有许多库(如CGAL )会执行相同的function。

这是一个复杂的,资源昂贵的方法,但是可以用下面的步骤绘制任何凹多边形(注意这个方法确实可以在平面多边形上工作,但是我也假定你尝试在平面上或2D正交模式下绘图) :

  • 启用模板testing,使用glStencilFunc(GL_ALWAYS,1,0xFFFF)
  • 禁用颜色掩码来检查不需要的绘制: glColorMask(0,0,0,0)
  • 我认为你有一个double或者其他forms的顶点(强烈推荐,因为这个方法多次绘制相同的多边形,但也可以使用glList或glBegin-glEnd)
  • 设置glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
  • 将该多边形绘制为GL_TRIANGLE_FAN

现在在模版图层上,您可以将绘制的多边形的三angular形设置为> 0。 诀窍是,所有有效的多边形区域都充满了mod2 = 1的值,这是因为三angular形扇形沿着多边形表面进行扫描,如果选定的三angular形有多边形外的区域,它将被绘制两次(一次当前序列,然后在绘制有效区域的下一个绘图中)这可能发生多次,但是在所有情况下,多边形外部的像素绘制偶数次,内部像素绘制奇数次。 当像素的顺序导致外部区域不再被绘制时,可能会发生一些例外。 为了过滤这些情况,必须绘制反向的顶点数组(所有这些情况在切换顺序时都能正常工作): – 设置glStencilFunc(GL.GL_EQUAL,1,1)以防止这些错误发生在相反的方向上(只能绘制区域在第一次绘制的多边形内,所以在另一个方向发生的错误将不会apperar,逻辑上这会产生两个half-solution的交集) – 以相反的顺序绘制多边形,保持glStencilFunc增加扫描的像素值现在我们有一个使用pixel_value%2 = 1的正确模板图层,其中像素确实在多边形内。 最后一步是绘制多边形本身: – 设置glColorMask(1,1,1,1)绘制可见多边形 – 保持glStencilFunc(GL_EQUAL,1,1)绘制正确的像素 – 绘制相同模式的多边形(顶点数组等),或者如果您绘制时没有光照/纹理,也可以绘制一个单一的全屏幕矩形(比绘制所有顶点更快,只有有效的多边形像素将被设置)

如果一切顺利,多边形是正确绘制的,请确保在此function之后重置模板使用(模板testing)和/或清除模板缓冲区(如果您还将其用于其他目的)。

检查胶水 ,其中镶嵌function,可以处理凹多边形。

Interesting Posts