我需要在OpenGL中绘制一个凹面多边形。
多边形被定义为形成其外环的点的列表,以及定义其内环(排除区)的点的列表。
我已经可以处理隔离区,所以如何绘制一个没有内环的多边形的解决方案也会很好。
使用Boost.Geometry的解决方案会很好,因为我已经在我的应用程序中大量使用它。
我需要这个在iPhone上工作,即OpenGL ES (具有固定管道的旧版本)。
我该怎么做呢?
发布于 2011-10-08 08:40:35
试试OpenGL的tessellation facilities。可以使用它将复杂的多边形转换为一组可以直接渲染的三角形。
编辑(回复注释):OpenGL ES不支持细分函数。在这种情况下,如果多边形是静态数据,则可以在台式机或笔记本电脑上使用OpenGL脱机生成细分。
如果形状是动态的,那么使用OpenGL ES就不太走运了。然而,有许多库(例如,CGAL)将执行相同的功能。
发布于 2014-04-14 18:20:40
这是一个有点复杂和资源消耗的方法,但任何凹面多边形都可以通过以下步骤绘制(注意,这种方法肯定适用于平面多边形,但我也假设您尝试在平面上绘制,或在2D正交模式下绘制):
启用模板测试,使用glStencilFunc(GL_ALWAYS,1,0xFFFF)
glColorMask(0,0,0,0)
glColorMask(0,0,0,0)
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
(将多边形设置为glBegin glEnd)
现在,在模板层上,绘制多边形的三角形的位数设置为>0。诀窍是,所有有效的多边形区域都填充了具有mod2=1的值,这是因为三角形扇形绘制沿着多边形表面扫描,如果选定的三角形具有多边形外部的区域,它将被绘制两次(在当前序列中绘制一次,然后在绘制有效区域时在下一个图形上)。这种情况可能会发生多次,但在所有情况下,多边形外部的像素被绘制偶数次,内部的像素被绘制奇数次。当像素顺序导致不能再次绘制外部区域时,可能会发生一些例外情况。要过滤这些情况,必须绘制反向顶点数组(当顺序切换时,所有这些情况都可以正常工作):-设置glStencilFunc(GL.GL_EQUAL,1,1)以防止这些错误在反向发生(只能在第一次绘制的多边形内部绘制区域,因此在另一个方向上发生的错误不会明显,逻辑上这会生成两个半解决方案的相交)-以相反的顺序绘制多边形,保持glStencilFunc以增加扫描像素值现在我们有了一个正确的模板层,其中像素真正位于多边形内部。最后一步是绘制多边形本身:-设置glColorMask(1,1,1,1)以绘制可见多边形-保留glStencilFunc(GL_EQUAL,1,1)以绘制正确的像素-以相同的模式绘制多边形(顶点数组等),或者如果您在没有照明/纹理的情况下绘制,也可以绘制单个全屏幕矩形(比绘制所有顶点更快,并且只会设置有效的多边形像素)
如果一切顺利,多边形被正确绘制,请确保在此功能之后重置模板使用(模板测试)和/或清除模板缓冲区(如果您还将其用于其他目的)。
发布于 2012-11-08 02:01:29
Check out glues,它具有可以处理凹面多边形的镶嵌函数。
https://stackoverflow.com/questions/7694037
复制相似问题