首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL中绘制凹多边形

在OpenGL中绘制凹多边形
EN

Stack Overflow用户
提问于 2011-10-08 08:37:18
回答 3查看 8.9K关注 0票数 6

我需要在OpenGL中绘制一个凹面多边形。

多边形被定义为形成其外环的点的列表,以及定义其内环(排除区)的点的列表。

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

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

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

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-08 08:40:35

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

编辑(回复注释):OpenGL ES不支持细分函数。在这种情况下,如果多边形是静态数据,则可以在台式机或笔记本电脑上使用OpenGL脱机生成细分。

如果形状是动态的,那么使用OpenGL ES就不太走运了。然而,有许多库(例如,CGAL)将执行相同的功能。

票数 6
EN

Stack Overflow用户

发布于 2014-04-14 18:20:40

这是一个有点复杂和资源消耗的方法,但任何凹面多边形都可以通过以下步骤绘制(注意,这种方法肯定适用于平面多边形,但我也假设您尝试在平面上绘制,或在2D正交模式下绘制):

启用模板测试,使用glStencilFunc(GL_ALWAYS,1,0xFFFF)

  • disable颜色蒙版来防止不需要的绘制:glColorMask(0,0,0,0)

  • I认为您有一个双精度数组中的顶点,或者是其他形式的顶点(强烈建议使用此方法多次绘制相同的多边形,但也可以使用glList或glBegin-glEnd )将多边形设置为glColorMask(0,0,0,0)

  • I glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)

  • draw as GL_TRIANGLE_FAN

(将多边形设置为glBegin glEnd)

  • glList
  • as glEnd(将多边形设置为glBegin)

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-08 02:01:29

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7694037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档