第4课:OpenGL几何图原——多边形

这篇博客介绍了如何使用OpenGL进行多边形的绘制,包括设置填充模式、线形模式、镂空模式,并展示了不同模式下的效果。还通过示例程序解释了如何利用glPolygonMode、glFrontFace和glPolygonStipple函数来改变多边形的显示方式,以及如何创建和应用自定义的镂空图案。此外,提到了剔除多边形表面以提高处理效率的方法。
摘要由CSDN通过智能技术生成
 看下面一个关于多边形的程序:     

#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 ;      
}      
运行效果图如下:    
 
填充模式有如下几种:     
          填充模式                                   解释说明     
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);则效果图如下:  
下面我想借用网络上的例子来说明一下自己的心得,其中部分文字来自网络。 

剔除多边形表面 

在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。在这种时候,可以将不必要的面剔除。 

使用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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值