看下面一个关于多边形的程序:
#include
<
windows.h
>
#include < GL / glut.h >
void myDisplay( void )
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
glFrontFace(GL_CCW); // 设置逆时针方向为正面
glBegin(GL_POLYGON); // 按逆时针绘制一个正方形,在左下方
glVertex2f( - 0.5f , - 0.5f );
glVertex2f( 0.0f , - 0.5f );
glVertex2f( 0.0f , 0.0f );
glVertex2f( - 0.5f , 0.0f );
glEnd();
glBegin(GL_POLYGON); // 按顺时针绘制一个正方形,在右上方
glVertex2f( 0.0f , 0.0f );
glVertex2f( 0.0f , 0.5f );
glVertex2f( 0.5f , 0.5f );
glVertex2f( 0.5f , 0.0f );
glEnd();
glFlush();
}
int main( int argc, char * argv[])
{
glutInit( & argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition( 100 , 100 );
glutInitWindowSize( 400 , 400 );
glutCreateWindow( " 画多边形(正面为填充模式,反面为线形模式) " );
glutDisplayFunc( & myDisplay);
glutMainLoop();
return 0 ;
}
#include < GL / glut.h >
void myDisplay( void )
{
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
glFrontFace(GL_CCW); // 设置逆时针方向为正面
glBegin(GL_POLYGON); // 按逆时针绘制一个正方形,在左下方
glVertex2f( - 0.5f , - 0.5f );
glVertex2f( 0.0f , - 0.5f );
glVertex2f( 0.0f , 0.0f );
glVertex2f( - 0.5f , 0.0f );
glEnd();
glBegin(GL_POLYGON); // 按顺时针绘制一个正方形,在右上方
glVertex2f( 0.0f , 0.0f );
glVertex2f( 0.0f , 0.5f );
glVertex2f( 0.5f , 0.5f );
glVertex2f( 0.5f , 0.0f );
glEnd();
glFlush();
}
int main( int argc, char * argv[])
{
glutInit( & argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition( 100 , 100 );
glutInitWindowSize( 400 , 400 );
glutCreateWindow( " 画多边形(正面为填充模式,反面为线形模式) " );
glutDisplayFunc( & myDisplay);
glutMainLoop();
return 0 ;
}
运行效果图如下:

填充模式有如下几种:
填充模式 解释说明
glPolygonMode(GL_FRONT, GL_FILL); 设置正面为填充方式
glPolygonMode(GL_BACK, GL_LINE); 设置反面为边缘绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); 设置两面均为顶点绘制方式
例如, 我们将程序中如下句
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
改为
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
效果图如下:
填充模式 解释说明
glPolygonMode(GL_FRONT, GL_FILL); 设置正面为填充方式
glPolygonMode(GL_BACK, GL_LINE); 设置反面为边缘绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); 设置两面均为顶点绘制方式
例如, 我们将程序中如下句
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
改为
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式
效果图如下:

可以通过glFrontFace函数来交换“正面”和“反面”的概念,如下:
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针
若将程序中glFrontFace(GL_CCW);换成glFrontFace(GL_CW);则效果图如下:
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针
若将程序中glFrontFace(GL_CCW);换成glFrontFace(GL_CW);则效果图如下:

下面我想借用网络上的例子来说明一下自己的心得,其中部分文字来自网络。
剔除多边形表面
在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。
使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)
使用glCullFace来进行剔除。
glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。
镂空多边形
这个可是很好玩的啊~~
直线可以被画成虚线,而多边形则可以进行镂空。
首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。
然后,使用glPolygonStipple来设置镂空的样式。
void glPolygonStipple(const GLubyte *mask);
其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。
但是,如果我们直接定义这个mask数组,像这样:
剔除多边形表面
在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。
使用glEnable(GL_CULL_FACE);来启动剔除功能(使用glDisable(GL_CULL_FACE)可以关闭之)
使用glCullFace来进行剔除。
glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。
镂空多边形

直线可以被画成虚线,而多边形则可以进行镂空。
首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。
然后,使用glPolygonStipple来设置镂空的样式。
void glPolygonStipple(const GLubyte *mask);
其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。
但是,如果我们直接定义这个mask数组,像这样:
static
GLubyte Mask[
128
]
=
{
0x00 , 0x00 , 0x00 , 0x00 , // 这是最下面的一行
0x00 , 0x00 , 0x00 , 0x00 ,
0x03 ,
{
0x00 , 0x00 , 0x00 , 0x00 , // 这是最下面的一行
0x00 , 0x00 , 0x00 , 0x00 ,
0x03 ,