6

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

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

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

我需要它才能在 iPhone 上工作,即 OpenGL ES(具有固定管道的旧版本)。

我怎样才能做到这一点?

4

3 回答 3

6

试试 OpenGL 的曲面细分工具。您可以使用它将复杂的多边形转换为一组可以直接渲染的三角形。

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

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

于 2011-10-08T00:40:34.730 回答
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) 绘制正确的像素 - 以相同的模式绘制多边形(顶点数组等),或者如果你在没有照明/纹理的情况下绘制,单个全屏矩形可以也被绘制(比绘制所有顶点更快,并且只会设置有效的多边形像素)

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

于 2014-04-14T10:20:39.507 回答
0

查看具有可以处理凹多边形的镶嵌功能的胶水。

于 2012-11-07T18:01:28.597 回答