openGL入门

来源:互联网 发布:婚礼现场设计软件 编辑:程序博客网 时间:2024/04/30 12:07

第一章 opengl简介

1.1 什么是opengl

opengl是图形硬件的一种软件接口。

       1>渲染(rendering)是计算机根据模型创建图像的过程。

2>模型(model)是根据几何图元创建的,也成为物体(object)。

3>几何图元包括点、直线、和多边形等,它们是通过顶点(vertex)指定的。

4>像素是显示硬件可以在屏幕上显示的最小可视元素。

5>OpenGL是一个状态机。

6>OpenGL渲染管线 的一些关键阶段

1. 显示列表

任何数据,不论它描述的是几何图元还是像素,都可以保存在显示列表(display list)中,供当前或以后使用。

2. 求值器

所有的几何图元最终都要通过顶点来描述。求值器提供了一种方法,根据控制点计算表示表面的顶点。这种方法是一种多项式映射,它可以根据控制点产生表面法线、纹理坐标、颜色以及空间坐标值。

3. 基于顶点的操作

把顶点变换为图元

4. 图元装配

图元装配的一个主要内容就是裁剪。

5. 像素操作

6. 纹理装配

OpenGL应用程序可以在几何物体上应用纹理图像,使他们看上去更为逼真。

7. 光栅化

光栅化就是把几何数据和像素数据转换为片段的过程。

8. 片段操作

在数据实际存储到帧缓冲区之前,要执行一系列的操作(纹理处理、测试等)。

7>处理输入事件

1. 可以使用下面这些函数注册一些回调函数,当指定的事件发生时,这些函数便会被调用

glutReshapeFunc(void(*func)(int w, int h)) 表示当窗口的大小发生改变时应该采取什么行动;

glutKeyboardFunc(void(*func)(unsigned char key, int x, int y))把键盘上的一个键与一个函数相关联,当键被按下或释放时函数被调用;

glutMouseFunc(void(*func)(int button, int state, int x, int y))把鼠标上的一个按钮与一个函数相关联,当按钮被按下或释放时函数被调用;

glutMotionFunc(void(*func)(int x, int y))注册了一个函数,当按下一个鼠标按钮移动鼠标时,这个函数就会被调用。

8>空闲处理

glutIdleFunc(void(*func)(void));如果向它传递NULL(0),就相当于禁用这个函数。

9>绘制三维物体

圆锥体,立方体、十二面体、二十面体、八面体、球体、茶壶、四面体、圆环面。

10>电影院,每秒24帧 把图片投影到屏幕

11>OpenGL渲染环境是OpenGL在其中存储状态信息的数据结构。

12>模式是特定于应用程序领域的OpenGL功能集的子集。

13>访问OpenGL函数--找到函数的地址。

范例:

此程序使用了鼠标响应函数和类似重绘的函数。

[cpp] view plaincopyprint?
  1. #include<GL/glut.h>   
  2.   
  3. static GLfloat spin = 0.5;  
  4.   
  5. void init(void)  
  6. {  
  7.     glClearColor(0.0,0.0,0.0,0.0);  
  8.     glShadeModel(GL_FLAT);   //设置着色模式,恒定着色或光滑着色  
  9. }  
  10.   
  11. void display(void)  
  12. {  
  13.     glClear(GL_COLOR_BUFFER_BIT);  
  14.     glPushMatrix();  
  15.     glRotatef(spin,0.0,0.0,1.0);  
  16.     glColor3f(1.0,1.0,1.0);  
  17.     glRectf(-25.0,-25.0,25.0,25.0);  
  18.     glPopMatrix();  
  19.     glutSwapBuffers();  
  20. }  
  21.   
  22. void spinDisplay(void)  
  23. {  
  24.     spin += 2.0;  
  25.     if(spin > 360.0)  
  26.         spin -= 360.0;  
  27.     glutPostRedisplay(); //使每次循环先调用该函数所在函数,然后调用display  
  28. }  
  29.   
  30. void reshape(int w, int h)  
  31. {  
  32.     glViewport(0, 0, (GLsizei)w, (GLsizei)h); //选择一个所要的绘图区域  
  33.     glMatrixMode(GL_PROJECTION);  
  34.     glLoadIdentity();  
  35.     glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);  
  36.     glMatrixMode(GL_MODELVIEW);  
  37.     glLoadIdentity();  
  38. }  
  39.   
  40. void mouse(int button, int state, int x, int y)  
  41. {  
  42.     switch(button)  
  43.     {  
  44.         case GLUT_LEFT_BUTTON:  
  45.             if(state == GLUT_DOWN)  
  46.                 glutIdleFunc(spinDisplay);  
  47.             break;  
  48.         case GLUT_MIDDLE_BUTTON:  
  49.             if(state == GLUT_DOWN)  
  50.                 glutIdleFunc(0);  
  51.             break;  
  52.         default:  
  53.             break;  
  54.   
  55.     }  
  56. }  
  57.   
  58. int main(int argc, char** argv)  
  59. {  
  60.     glutInit(&argc, argv);  
  61.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
  62.     glutInitWindowSize(250,250);  
  63.     glutInitWindowPosition(100,100);  
  64.     glutCreateWindow(argv[0]);  
  65.     init();  
  66.     glutDisplayFunc(display);  
  67.     glutReshapeFunc(reshape);  
  68.     glutMouseFunc(mouse);  
  69.     glutMainLoop();  
  70.     return 0;  
  71. }  


第三章 观察

3.1 观察点和矩阵的使用

[cpp] view plaincopyprint?
  1. #include<GL/glut.h>   
  2. void init(void)  
  3. {  
  4.     glClearColor(0.0,0.0,0.0,0.0);  
  5.     glShadeModel(GL_FLAT);  
  6. }  
  7.   
  8. void display(void)  
  9. {  
  10.     glClear(GL_COLOR_BUFFER_BIT);  
  11.     glColor3f(1.0,0.0,0.0);  
  12.     glLoadIdentity();     //清空矩阵   
  13.     /*   视点变换   */  
  14.     gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);  
  15.     glScalef(1.0,2.0,1.0);  //模型变换  
  16.     glutWireCube(1.0);  
  17.     glFlush();  
  18. }  
  19.   
  20. void reshape(int w, int h)  
  21. {  
  22.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
  23.     glMatrixMode(GL_PROJECTION);  
  24.     glLoadIdentity();  
  25.     glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);  
  26.     glMatrixMode(GL_MODELVIEW);  
  27. }  
  28.   
  29. int main(int argc, char** argv)  
  30. {  
  31.     glutInit(&argc, argv);  
  32.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
  33.     glutInitWindowSize(400,400);  
  34.     glutInitWindowPosition(200,200);  
  35.     glutCreateWindow("study");  
  36.     init();  
  37.     glutDisplayFunc(display);  
  38.     glutReshapeFunc(reshape);  
  39.     glutMainLoop();  
  40.     return 0;  
  41. }  


3.4 GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};

glClipPlane(GL_CLIP_PLANE0, eqn);

glEnable(GL_CLIP_PLANE0);     即可删除y轴下部分附加载剪面

[cpp] view plaincopyprint?
  1. #include<GL/glut.h>   
  2. void init(void)  
  3. {  
  4.     glClearColor(0.0,0.0,0.0,0.0);  
  5.     glShadeModel(GL_FLAT);  
  6. }  
  7.   
  8. void display(void)  
  9. {  
  10.     GLdouble eqn[4] = {0.0,1.0,0.0,0.0};  
  11.     GLdouble eqn2[4] = {1.0,0.0,0.0,0.0};  
  12.   
  13.     glClear(GL_COLOR_BUFFER_BIT);  
  14.     glColor3f(1.0,1.0,1.0);  
  15.     glPushMatrix();  
  16.     glTranslatef(0.0,0.0,-5.0);  
  17.   
  18.     /* 截掉下半部分(y坐标小于0的部分)*/  
  19.     glClipPlane(GL_CLIP_PLANE0,eqn);  
  20.     glEnable(GL_CLIP_PLANE0);  
  21.     /* 截掉下半部分(y坐标小于0的部分)*/  
  22.     glClipPlane(GL_CLIP_PLANE1,eqn2);  
  23.     glEnable(GL_CLIP_PLANE1);  
  24.   
  25.     glRotatef(90.0,1.0,0.0,0.0);  
  26.     glutWireSphere(1.0,20,16);  
  27.     glPopMatrix();  
  28.     glFlush();  
  29.       
  30. }  
  31.   
  32. void reshape(int w, int h)  
  33. {  
  34.     glViewport(0, 0, (GLsizei)w, (GLsizei)h);  
  35.     glMatrixMode(GL_PROJECTION);  
  36.     glLoadIdentity();  
  37.     gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0);  
  38.     glMatrixMode(GL_MODELVIEW);  
  39. }  
  40.   
  41. int main(int argc, char** argv)  
  42. {  
  43.     glutInit(&argc, argv);  
  44.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  
  45.     glutInitWindowSize(400,400);  
  46.     glutInitWindowPosition(200,200);  
  47.     glutCreateWindow("study");  
  48.     init();  
  49.     glutDisplayFunc(display);  
  50.     glutReshapeFunc(reshape);  
  51.     glutMainLoop();  
  52.     return 0;  
  53. }  

0 0
原创粉丝点击