【问题标题】:Drawing a concave polygon in OpenGL在OpenGL中绘制一个凹多边形
【发布时间】:2011-10-08 00:37:17
【问题描述】:

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

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

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

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

我该怎么做?

【问题讨论】:

    标签: ios opengl-es polygon concave


    【解决方案1】:

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

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

    如果形状是动态的,那么您在使用 OpenGL ES 时就不走运了。但是,有许多库(例如,CGAL)可以执行相同的功能。

    【讨论】:

    • 不,那是 OpenGL ES,它不提供曲面细分功能。如果您需要在 iPhone 上执行此操作,您应该修改问题以明确这一点。
    • 你知道Boost能不能做到吗?如果不是,我将求助于离线计算,因为形状不是动态的。
    • 我对 Boost.Geometry 一无所知。该项目的当前状态并不是一个好兆头,但如果它是一次性的练习,它可能不是这样的问题。再想一想,也许甚至有一个工具可以在不编写任何代码的情况下执行曲面细分(不过我不知道)。
    【解决方案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) 以防止这些错误发生在反向(只能在第一次绘制的多边形内绘制区域,因此不会出现在另一个方向上发生的错误,从逻辑上讲,这会生成 intersectoin两个半解) - 以相反的顺序绘制多边形,保持 glStencilFunc 增加扫描像素值 现在我们有一个正确的模板层,pixel_value%2=1,其中像素真正位于多边形内部。最后一步是绘制多边形本身: - 设置glColorMask(1,1,1,1) 绘制可见多边形 - 保持 glStencilFunc(GL_EQUAL,1,1) 绘制正确的像素 - 以相同的模式绘制多边形(顶点数组等),或者如果您在没有照明/纹理的情况下绘制,也可以绘制单个全屏矩形(比绘制所有顶点更快,并且只有有效的多边形像素将是设置)

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-02-18
        • 2014-01-27
        • 2010-10-16
        • 1970-01-01
        • 2018-09-29
        • 2013-03-11
        • 1970-01-01
        相关资源
        最近更新 更多