在OpenGL中绘制凹多边形

时间:2011-10-08 00:37:18

标签: ios opengl-es polygon concave

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

我已经可以处理禁区了,所以如何绘制没有内环的多边形的解决方案也会很好。

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

我需要这个才能在iPhone上运行,即OpenGL ES(带有固定管道的旧版本)。

我该怎么做?

3 个答案:

答案 0 :(得分:6)

尝试OpenGL的tessellation facilities。您可以使用它将复杂多边形转换为一组三角形,您可以直接渲染它们。

编辑(回应评论):OpenGL ES不支持曲面细分功能。在这种情况下,如果多边形是静态数据,您可以使用台式机或笔记本电脑上的OpenGL离线生成曲面细分。

如果形状是动态的,那么你对OpenGL ES不满意。但是,有许多库(例如,CGAL)将执行相同的功能。

答案 1 :(得分:2)

它有点复杂,而且资源成本高,但任何凹多边形都可以通过以下步骤绘制(注意这个方法肯定适用于平面多边形,但我也假设你尝试在平面上绘图,或者在2D正交模式下):

  • 启用模板测试,使用glStencilFunc(GL_ALWAYS,1,0xFFFF)
  • 禁用颜色蒙版以防止不必要的绘制:glColorMask(0,0,0,0)
  • 我认为你有一个双精度数组或其他形式的顶点(强烈建议这个方法多次绘制相同的多边形,但也可以使用glList或glBegin-glEnd)
  • 设置glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
  • 将多边形绘制为GL_TRIANGLE_FAN

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

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

答案 2 :(得分:0)

Check out glues,它具有可以处理凹多边形的曲面细分函数。