开搞以前,得先把凑齐装备。不期望能像孙大圣,那样上来就配个十万八千斤的金箍棒,但基本的工具仍是要必备的。html
OpenGL只负责图形的渲染,因此想窗口的建立,读取图片,生成矩形神马的。都不属于GL的范畴,同时为了贯彻“坚定不重复造轮子”的方针,决定配备如下工具编程
OpenGL实用工具包:freeglut——建立和管理各个平台平台上的OpenGL上下文的窗口,也看到鼠标,键盘和操纵杆功能缓存
OpenGL数学库:glm——生成OpenGL所需的各类矩阵ide
OpenGL扩展库:glew——用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。函数
配置OpenGL的环境,可谓老生常谈的问题。推荐参考这篇文章工具
http://www.cnblogs.com/liangliangh/p/3521381.html测试
不只告诉你怎么配置,还会解决配置遇到的各类问题。建议仔细阅读。动画
先来看看效果,会变色哦~~spa
既然学的是OpenGL,也就不必纠结什么Win32窗口编程之类的旁枝细节,恰好glut为咱们提升提供良好的平台,几句代码就能建立一个窗口,之后的工做都会在这个窗口里进行。3d
第一个窗口就正式诞生了,虽然一片空白
PS:之后main函数的代码大体是不会变的,基本上就是这个步骤
l初始化GL的绘制模式
l设置窗口大小
l建立窗口
l设置改变窗口大小的回调函数
l设置键盘按下和松开的回调函数
l设置特殊按键按下和松开的回调函数
l设置渲染的回调函数
l初始化GL的扩展库(因为Windows只支持OpenGL1.x)若是想使用可编程管线,必需要用到glew库
lGL的初始化
l全部设置完成后,开始主循环
void init(){ glClearColor(0,0,0,1); glEnable(GL_DEPTH_TEST); }
#2:设置清屏颜色
GLAPIvoidGLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
看参数就知道,GL是经过RGBA来设置颜色。不知道RGBA是神马玩意的,请自行Google~~
#3:开启深度测试。这里简单介绍下,OpenGL的3D API,所以要有个三维的概念,近的物体会把远的物体挡住,这样远的物体所有或者部分就不用绘制了。要使OpenGL具备这个功能,就须要开启深度测试。通常状况下,为了可观性和真实性,都会开启该选项。
好了如今让咱们run起来。
咦?为啥仍是白色的?不是设置了清屏颜色是黑色了吗?
缘由就在于,设置是设置了,可是真正的清屏操做并无执行。看过动漫的都知道,动画的原理,就是一张张画出来,而后快速播放。
GL绘制时也是这样的原理,只不过GL每次绘制的图形,称做帧。
glutDisplayFunc(display);
main函数的这句代码,就是设置GL的绘制函数。GL绘制图形,实际上就是执行display().
void display(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); }
#2:glClear:真正执行清除操做的地方。咱们能够经过设置不一样的标志位来清除不一样的缓存。
好比:GL_COLOR_BUFFER_BIT就是用glClearColor设置的颜色清除颜色缓存。
GL_DEPTH_BUFFER_BIT就是清除深度缓存。
OK,再来运行
Oh~~神马状况,怎么仍是白色?
实际上,缓存已经清除了,只是GL是在后台清除的。由于,咱们使用的双缓冲。
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
其中GLUT_DOUBLE就是设置双缓冲。
实际上,咱们清屏操做是在Back Buffer执行的,从图中能够看到,GL绘制时在Back Buffer上绘制的,而后在和前台缓冲,也就是屏幕,交换。也就是”前“变”后“,”后“变"前”。循环以上操做。
所以,咱们还得再加上这句代码,让先后缓冲交换。
void display(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glutSwapBuffers(); }
这下终于变黑色了。这样,咱们GL的初始化工做就作好了。