这是我第二次学习OPENGL,第一次学习是在大二的计算机图形学课堂上,那是对opengl只是走马观花,现在过了两年,我打算把opengl进行新一编完整而系统的学习,有三个目的:1.熟练掌握opengl编程,2从opegl的体系中加深对计算机图形渲染管线的整个体系的了解,作为深入学习GPU编程的进阶,3.制作好看的CG作品。
这里是我在学习《opengl programming guide fifth edition》过程的从头到尾的整个的学习笔记,放在这里,给自己做个以后的参考,也想与大家交流。有很多错别字,请原谅~~
最前面:OpenGL是一个开放的2D/3D图形绘制的工业标准,正因为只是一个标准,所以OPENGL的管理者并没有一个所谓的SDK,所有开发者可以使用的SDK都是Khronos Group(OpenGl标准的管理者)的成员应用这个标准自己编写的(它的成员可以得到这个标准),例如常见在Microsoft的Visual Studio下的opengl是由微软根据OpenGl1.1而自己编写的。
Opengl的更高版本的更多特性都叫做,OPENGL扩展,不同的显卡支持这些扩展中的不同扩展函数,所以使用更高级的特性时你必须拥有这些扩展库,并且你的显卡支持你用的特性。
GLEW就是一个非常好的扩展库,它包括了最近的OPENGL核心库,和大量的扩展库,并且可以根据硬件自动识别哪些扩展可用。并且NVIDIA会有最新的OPENGL_SDK_Guide,这个guide其实就是以各种DEMO的形式来向开发者展示他们的显卡都支持到的最新的核心库和哪些扩展库,他们的DEMO基本上也是用GLEW来写的。
NVIDIA为了支持OPENGL的更高版本和新的扩展也会经常发布新的硬件驱动,来支持OPENGL的发展,可随时关注NVIDIA的开发者网站。
0. 配置开发环境:
在VS2005下一般选用WIN32控制台程序,然后还要加入<window.h>
1. glut程序的一般组成:
glutInit
glutInitDisplayMode
glutInitWindowPosition
glutInitWindowSize
glutCreateWindow
直到调用glutMainLoop()窗口才真的会显现
每当窗口内容需要重绘时都会调用glutDisplayFunc(void (*func)(void)),当你再改变某些内容想强制重绘时可调用glutPostRedisplay(void)发送一个信号
2 glut的四个时间响应回掉函数
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))
3.双缓存,一个显示,另一个准备下一帧的绘制,当下一帧绘制好来,切换到另一个缓存,如此交替,可以时人看不到绘制当过程,只有绘制好当结果才会被看到,就不会出现黑的屏幕(闪)。
在写运动的程序中,除来初始化时用glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB)外,在绘制函数的最后一般要加上glutSw