我正在尝试使用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();
从附图中可以看出,我的结果好坏参半。对于某些观点,它可以起作用,但对于其他观点则不然。
修正凹多边形:
不正确的凹多边形1:
凹面多边形2不正确: