开搞之前,得先把凑齐装备。不指望能像孙大圣,那样上来就配个十万八千斤的金箍棒,但基本的工具还是要必备的。
OpenGL只负责图形的渲染,所以想窗口的创建,读取图片,生成矩形神马的。都不属于GL的范畴,同时为了贯彻“坚决不重复造轮子”的方针,决定配备以下工具
OpenGL实用工具包:freeglut――创建和管理各个平台平台上的OpenGL上下文的窗口,也看到鼠标,键盘和操纵杆功能
OpenGL数学库:glm――生成OpenGL所需的各种矩阵
OpenGL扩展库:glew――用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。
配置OpenGL的环境,可谓老生常谈的问题。推荐参考这篇文章
http://www.cnblogs.com/liangliangh/p/3521381.html
不仅告诉你怎么配置,还会解决配置遇到的各种问题。建议仔细阅读。
先来看看效果,会变色哦~~
既然学的是OpenGL,也就没必要纠结什么Win32窗口编程之类的旁枝细节,刚好glut为我们提高提供良好的平台,几句代码就能创建一个窗口,以后的工作都会在这个窗口里进行。
第一个窗口就正式诞生了,虽然一片空白
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的初始化工作就做好了。