使用模板测试绘制凹面多边形

时间:2018-02-28 01:26:30

标签: c++ opengl polygon stencil-buffer

我正在尝试使用the stencil buffer trick outlined in the OpenGL redbook绘制凹多边形,但我似乎无法使其正常工作。

根据红皮书,我在启用模板测试之前首先清除模板缓冲区。接下来,我禁用对颜色缓冲区的任何写入并绘制我的三角形。红皮书指出我可以使用任意点来开始我的三角扇调用,所以我使用了(0,0)。请参阅以下代码以供参考:

    glMatrixMode(GL_MODELVIEW);
    glPushAttrib( GL_CURRENT_BIT );
    glDisable(GL_DEPTH_TEST);
    glPushMatrix();
    glClear( GL_STENCIL_BUFFER_BIT );

    glEnable( GL_STENCIL_TEST );
    glColorMask( GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE );
    glStencilOp( GL_KEEP, GL_KEEP, GL_INVERT );
    glStencilFunc( GL_ALWAYS, 0x1, 0x1 );

    glBegin(GL_TRIANGLE_FAN);

    glVertex2d(0.0, 0.0);

    for(int i = 0; i < oglPoints.size(); i++)
    {
        glVertex2d(oglPoints[i].x, oglPoints[i].y);
    }

    glVertex2d(oglPoints[0].x, oglPoints[0].y);

    glEnd();

    glColor3d(1.0, 1.0, 0.0);
    glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
    glStencilFunc( GL_EQUAL, 0x1, 0x1 );

    glBegin(GL_TRIANGLE_FAN);

    for(int i = 0; i < oglPoints.size(); i++)
    {
        glVertex2d(oglPoints[i].x, oglPoints[i].y);
    }

    // glVertex2d(oglPoints[0].x, oglPoints[0].y);

    glEnd();

    glDisable( GL_STENCIL_TEST );
    glPopMatrix();
    glPopAttrib();

从附图中可以看出,我的结果好坏参半。对于某些观点,它可以起作用,但对于其他观点则不然。

修正凹多边形:

Correct concave polygon

不正确的凹多边形1:

Incorrect concave polygon 1

凹面多边形2不正确:

Incorrect concave polygon 2

0 个答案:

没有答案