第2课:OpenGL几何图原——点

来源:互联网 发布:mac photoshop cc 破解 编辑:程序博客网 时间:2024/05/18 23:54
通过一个OpenGL程序,详细讲解点,初步引出其它一些图原。
  
点的大小默认为1个像素,但也可以改变之。改变的命令为glPointSize,其函数原型如下:   
void glPointSize(GLfloat size);   
size必须大于0.0f,默认值为1.0f,单位为“像素”。   

看一个OpenGL程序:    

#include<windows.h>    
#include 
<GL/glut.h>   //glut.h中含有gl.h和glu.h文件    

void myDisplay(void)    
{    
    glClear(GL_COLOR_BUFFER_BIT);    
    glPointSize(
5.0f);    
    glBegin(GL_POINTS);    
        glVertex2f(
0.0f0.0f);    
        glVertex2f(
0.5f0.5f);    
    glEnd();    
    glFlush();    
}    

int main(int argc, char *argv[])    
{    
    glutInit(
&argc, argv);    
    glutInitDisplayMode(GLUT_RGB 
| GLUT_SINGLE);    
    glutInitWindowPosition(
100100);    
    glutInitWindowSize(
400400);    
    glutCreateWindow(
"画点(像素)");    
    glutDisplayFunc(
&myDisplay);    
    glutMainLoop();    
    
return 0;    
}   



编译运行后,效果图如下:  

假如我们把glPointSize(5.0f);改成glPointSize(50.0f);效果图如下:

若再改成glPointSize(200.0f); ,则效果很明显了:

则此时点已经成为带状了因此对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。   

下面针对上面的程序作一些必要的解释:   
(这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。)   

1、void myDisplay(void)是自己编写的函数,很像C语言中的子函数,在其它子函数或main()函数中可以随时调用。  

2、glClear()函数的原型为:void glClear(GLbitfield mask);指的是用当前的清除颜色值清除指定缓存,mask为所清除的缓存,其值可以为:  

       mask变量              清除的缓存  
GL_COLOR_BUFFER_BIT           颜色缓存  
GL_DEPTH_BUFFER_BIT           深度缓存  
GL_ACCUM_BUFFER_BIT           累加缓存  
GL_STENCIL_BUFFER_BIT         模板缓存  

通常void glClearColor(GLfloat r,GLfloat g,GLfloat b,GLfloat a);用于设置指定窗口的清除颜色,然后void glClear(GLbitfield mask);清除为刚才设置的清除颜色。r,g,b用于设置RGB颜色模型的三个分量,a为透明度设置。  

3、void glPointSize(GLfloat size);size必须大于0.0f,默认值为1.0f,单位为“像素”。  

4、OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin来指明如何使用这些点。  
在glBegin和glEnd之间,只有以下函数是有效的,其它函数全部会被忽略。  
glVertex*  
glColor*  
glIndex*  
glSecondaryColor*  
glNormal*  
glMaterial*  
glFogCood*  
glTexCood*  
glMultiTexCood*  
glEdgeFlag*  
glArrayElement*  
glEvalCoord*  
glEvalPoint*  
glCallList  
glCallLists  
其中*表示所有可能的命令格式,比如:glVertex3f(),glVertex2d()等等。  
glBegin支持的方式除了GL_POINTS以外,还有如下一些:  

glBegin()参数值                                 解释  
CL_POINTS                            一系列独立的点       
CL_LINES                               每两点相连成为险段  
CL_POLYGON                       简单、凸多边形的边界  
CL_TRIANGLES                    三点相连为一个三角形  
CL_QUADS                            四点相连为一个四边形  
CL_LINE_STRIP                    顶点相连为一折线  
CL_LINE_LOOP                    顶点相连为一折线,并将最后一点与第一点相连  
CL_TRIANGLE_STRIP        相连的三角形带  
CL_TRIANGLE_FAN           相连的三角形扇形  
CL_QUAD_STRIP                 相连的四边形带  

具体的效果图如下(来自网上):  

5、glVertex2f(0.0f, 0.0f);   
   glVertex2f(0.5f, 0.5f);  
表示连续画两个点(0.0, 0.0),(0.5, 0.5),窗口正中央为坐标原点(0.0,0.0)。    
OpenGL提供了一系列以glVertex开头的函数,后面跟一个数字和1~2个字母。例如:  
glVertex2d  
glVertex2f  
glVertex3f  
glVertex3fv  
等等。  
数字表示参数的个数,字母表示参数的类型,  
s表示16位整数(OpenGL中将这个类型定义为GLshort),  
i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),  
f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),  
d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。  
v表示传递的几个参数将使用指针的方式。  
这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:  
(1)glVertex2i(1, 3);  
(2)glVertex2f(1.0f, 3.0f);  
(3)glVertex3f(1.0f, 3.0f, 0.0f);  
(4)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);  
(5)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};  
     glVertex3fv(VertexArr3);  
常用glVertex*来表示这一系列函数。  

6、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。  

7、int main(int argc, char *argv[]),这个是带命令行参数的main函数,其实C语言中就接触过,入口主函数。   
注意:   
main函数中的各语句,除了最后的return之外,其余全部以glut开头。  

8、glutInit(&argc, argv); 对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。   

9、glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。   

10、void glutInitWindowPosition(),设置窗口在屏幕中的位置,参数即为坐标点的形式。  

11、void glutInitWindowSize(),设置窗口的大小。  

12、void glutCreateWindow(""),根据前面设置的信息创建窗口。参数字符串将被作为窗口的标题。  

13、void glutDisplayFunc(),设置一个函数,当需要进行画图时,这个函数就会被调用。  

14、void glutMainLoop(),进行一个消息循环,窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 遇到自私多疑的老公该怎么办 老年人吵架非说打她了装病怎么办 高三厌学家长该怎么办 考研团员档案丢了怎么办 学生的档案丢了怎么办 大四团员证丢了怎么办 2岁宝宝吸收不好怎么办 孩子逆反心理特强沟通不了怎么办 一年级孩子有逆反心里怎么办 如果一个学生会部门没人留怎么办 如果学生会部门很少人报名怎么办 职场说错话了我该怎么办? 中考通知书收到两份怎么办 高三学生英语差怎么办 论文查重百分之0怎么办 微信红包发错人了怎么办 文学社在社团活动日可以怎么办 小孩玩游戏瞎花钱怎么办 党员不配合纪检调查工作怎么办 新同事老问问题怎么办 白色衣服染红色了怎么办 左腿膝盖内侧疼怎么办 差二本线几分怎么办 吃错东西了想吐怎么办 玩游戏扣的话费怎么办 转笔实在是不会怎么办 滑板l轴承沾水了怎么办 暗影格斗3闪退怎么办 暗影格斗3文档被删怎么办 dnf手残党偷学技能学不了怎么办 打篮球没热身膝盖酸痛是怎么办 无线路由器lan口少怎么办? 电脑ip设置乱了怎么办 监控拍我我偷钱怎么办 网吧上网密码忘记了怎么办 比熊犬晚上叫怎么办 刚买的狗一直叫怎么办 酒驾罚款2年没交怎么办 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办