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

 看下面一个关于多边形的程序:     

#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 0x80
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,关于绘制多边形,我会为您提供一些OpenGL学习笔记。 首先,我们需要了解一下OpenGL绘制多边形的基本流程。OpenGL绘制多边形的过程包括三个基本步骤:指定顶点数据、指定绘制方式和执行绘制。 指定顶点数据:在OpenGL,我们可以使用glVertex等函数来指定多边形的顶点。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其,glBegin和glEnd函数用来指定绘制的方式,GL_TRIANGLES表示绘制三角形。glVertex3f函数用来指定三角形的三个顶点,每个顶点由三个坐标值组成。 指定绘制方式:OpenGL支持多种绘制方式,例如GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN等。在上面的代码,我们使用了GL_TRIANGLES来指定绘制三角形的方式。 执行绘制:最后,我们需要调用glDrawArrays函数来执行绘制。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glDrawArrays(GL_TRIANGLES, 0, 3); ``` 其,GL_TRIANGLES表示绘制三角形的方式,0表示顶点数组的起始位置,3表示顶点的数量。 以上就是OpenGL绘制多边形的基本流程,下面我们来看一下如何绘制着色多边形。 绘制着色多边形的过程与绘制普通多边形的过程基本相同,只需要在绘制前调用glColor函数来指定颜色即可。例如,如果我们要绘制一个红色的三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // 指定颜色为红色 glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其,glColor3f函数用来指定颜色,三个参数分别表示红、绿、蓝三个颜色通道的值,取值范围为0到1。 希望以上内容能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值