我有一个需要在 OpenGL 中绘制的凹多边形。
多边形被定义为形成其外环的点列表,以及定义其内环(禁区)的点列表。
我已经可以处理禁区,因此如何绘制没有内环的多边形的解决方案也很好。
Boost.Geometry的解决方案会很好,因为我已经在我的应用程序中大量使用它。
我需要它才能在 iPhone 上工作,即 OpenGL ES(具有固定管道的旧版本)。
我怎样才能做到这一点?
我有一个需要在 OpenGL 中绘制的凹多边形。
多边形被定义为形成其外环的点列表,以及定义其内环(禁区)的点列表。
我已经可以处理禁区,因此如何绘制没有内环的多边形的解决方案也很好。
Boost.Geometry的解决方案会很好,因为我已经在我的应用程序中大量使用它。
我需要它才能在 iPhone 上工作,即 OpenGL ES(具有固定管道的旧版本)。
我怎样才能做到这一点?
这有点复杂,而且资源成本很高,但是任何凹多边形都可以通过以下步骤绘制(注意这个方法肯定适用于平面多边形,但我也假设你尝试在平面上绘制,或者在 2D 正交模式下绘制) :
glStencilFunc(GL_ALWAYS,1,0xFFFF)
glColorMask(0,0,0,0)
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
现在在模板层上,您将位设置为 >0,其中绘制了多边形的三角形。诀窍是,所有有效的多边形区域都用 mod2=1 的值填充,这是因为三角形扇形图沿着多边形表面扫过,如果所选三角形有多边形之外的区域,它将被绘制两次(一次在当前序列,然后在绘制有效区域时在下一个绘图上)这可能会发生很多次,但在所有情况下,多边形外部的像素被绘制偶数次,内部像素被绘制奇数次。当像素顺序导致外部区域不再被绘制时,可能会发生一些例外情况。要过滤这些情况,必须绘制反向顶点数组(所有这些情况在切换顺序时都能正常工作): - 设置 glStencilFunc(GL.GL_EQUAL,1, 1)为了防止这些错误发生在反向(只能在第一次绘制的多边形内绘制区域,因此不会出现在另一个方向发生的错误,逻辑上这会产生两个半解的相交) - 绘制多边形以相反的顺序,保持 glStencilFunc 增加扫描像素值 现在我们有一个正确的模板层,pixel_value%2=1,其中像素真正位于多边形内部。最后一步是绘制多边形本身: - 设置glColorMask(1,1,1,1)
绘制可见多边形 - 保持 glStencilFunc(GL_EQUAL,1,1) 绘制正确的像素 - 以相同的模式绘制多边形(顶点数组等),或者如果你在没有照明/纹理的情况下绘制,单个全屏矩形可以也被绘制(比绘制所有顶点更快,并且只会设置有效的多边形像素)
如果一切顺利,多边形绘制正确,请确保在此功能后重置模板使用(模板测试)和/或清除模板缓冲区(如果您还将其用于其他目的)。
查看具有可以处理凹多边形的镶嵌功能的胶水。