OpenGL学习笔记(二)

1、OpenGL实用工具包(GLUT)
OpenGL包含渲染函数,但被涉及成独立于任何窗口系统和操作系统。因此, OpenGL并没用用于打开窗口以及检测键盘或鼠标事件的函数。GLUT库被用来简化这些相关任务,此外还提供了一些用于创建复杂三位物体(如球体、圆环和茶壶等)的函数。
    窗口管理函数
   glutInit(int *argc, char **argv),初始化GLUT并处理命令行参数,应在调用其他GLUT函数前调用glutInit()。
   glutInitDisplayMode(unsigned int mode),指定使用RGBA模式还是颜色索引模式。还可以指定使用单缓存还是双缓存等。
   glutInitWindowPosition(int x, int y),指定窗口左上角在屏幕上的位置。
   glutInitWindowSize(int width, int size),指定窗口的大小,单位为象素。
   int glutCreateWindow(char *string),使用一个OpenGL场景创建一个窗口,该函数返回一个标识符,唯一的标识新建的窗口,注意,在调用glutMainLoop()之前,窗口不会被显示出来。
    显示回调函数
   glutDisplayFunc(void(*func)(void))是最重要的时间回调函数。每当GLUT认为需要重新显示窗口的内容时,都将执行函数glutDisplayFunc()函数注册的回调函数,因此,应将为重新绘制场景需要调用的函数都放到显示回调函数中。如果程序修改了窗口的内容,可能需要调用函数glutPostRedisplay(void),它提醒函数glutMainLoop调用注册的显示回调函数。
    运行程序
   glutMainLoop(void),显示创建的所有窗口,被渲染到这些窗口中的内容也将显示出来。程序开始事件处理,这册的显示回调函数被触发,进入该循环,便不会退出。
    处理输入事件
   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)),这册了当用户按下鼠标按钮并移动鼠标时应调用的回调函数。
    管理后台处理
   glutIdleFunc(void(*func)(void))指定一个在没有其他事件需要处理时(如事件循环空闲)执行的函数。
    绘制三维物体
   glutWireCube(GLdouble size)、glutSolidCube(GLdouble size)、glutWireSphere(GLdouble radius, GLint slices,GLint statcks)、glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)等


2、从最抽象的角度看,有 三种基本的绘图操作:清空窗口、绘制几何体和绘制光栅物体。光栅物体包括二维图象、位图和字符字体等。在OpenGL中,除非特别声明,否则调用绘图函数后,将立刻绘制制定的物体。这看似理所当然,但在某些系统中,首先建立一个要绘制的物体列表,然后命令图形硬件绘列表中的物体。前一种方式被称为 直接模式(immediate-mode),OpenGL默认采用这种方式。除使用直接模式外,还可以将 命令存储在列表(显示列表)中,供以后使用。 直接模式更易于编程,但显示列表的效率更高。

3、 图形象素的颜色在图形硬件的位平面中有两种存储方法:一是直接将象素的红、绿、蓝三种颜色和alpha(RGBA)值存储到位平面中,二是存储一个引用颜色查询表的索引值。如glClearColor(0.0,0.0,0.0,0.0);将保存清空颜色的状态变量设置位黑色,glClear(GL_COLOR_BUFFER_BIT)接受一个参数,指出要清除那个缓存,这里只清除了颜色缓存。

4、glFlush()函数强制客户机发送网络分组,即使分组未被填满,当不涉及网络时,所有命令都立刻在服务器(看绘图效果的终端)上执行。注意, 如果要编写无论是否涉及网络都能正确运行的程序,必须在绘制完每个帧或场景后调用函数glFush(),该函数并不等待绘制完成,而是强行开始执行绘图操作,从而确保之前的所有命令都将在有限的时间内完成,即使后面没有其他的渲染命令。glFlush()主要用在下面情况下:一是用软件渲染程序在系统内存中建立图象,且不像不停的刷行屏幕;二是通过收集一组渲染函数来降低启动开销,前面提到的网络传输就数需这种情况。 glFinish()函数和glFlush类似,不过该函数是阻塞模式,当该函数之前的所有命令都执行完毕,图形绘制完成之后,该函数才返回。

5、大多数OpenGL实现都提供了 双缓存技术:支持两个完整颜色缓存的硬件或软件。绘制一个缓存时,显示另一个缓存中的内容。每绘制好一帧,便交换缓存,这样刚才被显示的缓存现在被用来绘制,而用来绘制的缓存则被显示。函数swap_the_buffer()还等待当前屏幕更新周期结束,以保证前一个缓存被完整的显示。该函数使得新缓存得以从头开始被完整的显示。 注意OpenGL没有提供swap_the_buffer()函数,在任何情况下,这种特性都与窗口系统相关。例如:在X窗口系统中是void glXSwapBuffers (Display *dpy, Window Window);在GLUT库中,则是void glutSwapBuffers(void)函数。
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值