一、工欲善其事,必先利其器。

开搞之前,得先把凑齐装备。不指望能像孙大圣,那样上来就配个十万八千斤的金箍棒,但基本的工具还是要必备的。

OpenGL只负责图形的渲染,所以想窗口的创建,读取图片,生成矩形神马的。都不属于GL的范畴,同时为了贯彻“坚决不重复造轮子”的方针,决定配备以下工具

  1. OpenGL实用工具包:freeglut——创建和管理各个平台平台上的OpenGL上下文的窗口,也看到鼠标,键盘和操纵杆功能

  2. OpenGL数学库:glm——生成OpenGL所需的各种矩阵

  3. OpenGL扩展库:glew——用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。

配置OpenGL的环境,可谓老生常谈的问题。推荐参考这篇文章

http://www.cnblogs.com/liangliangh/p/3521381.html

不仅告诉你怎么配置,还会解决配置遇到的各种问题。建议仔细阅读。

二、第一个OpenGL程序

先来看看效果,会变色哦~~

p_w_picpath002



1利用glut创建窗口

既然学的是OpenGL,也就没必要纠结什么Win32窗口编程之类的旁枝细节,刚好glut为我们提高提供良好的平台,几句代码就能创建一个窗口,以后的工作都会在这个窗口里进行。




第一个窗口就正式诞生了,虽然一片空白



p_w_picpath004





PS:以后main函数的代码大致是不会变的,基本上就是这个步骤

  1. l初始化GL的绘制模式

  2. l设置窗口大小

  3. l创建窗口

  4. l设置改变窗口大小的回调函数

  5. l设置键盘按下和松开的回调函数

  6. l设置特殊按键按下和松开的回调函数

  7. l设置渲染的回调函数

  8. l初始化GL的扩展库(由于Windows只支持OpenGL1.x)如果想使用可编程管线,必须要用到glew

  9. lGL的初始化

  10. l所有设置完成后,开始主循环

1.1调整好你的GL——初始化设置

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:开启深度测试。这里简单介绍下,OpenGL3D API,因此要有个三维的概念,近的物体会把远的物体挡住,这样远的物体全部或者部分就不用绘制了。要使OpenGL具有这个功能,就需要开启深度测试。一般情况下,为了可观性和真实性,都会开启该选项。



好了现在让我们run起来。

p_w_picpath004

咦?为啥还是白色的?不是设置了清屏颜色是黑色了吗?



原因就在于,设置是设置了,但是真正的清屏操作并没有执行。看过动漫的都知道,动画的原理,就是一张张画出来,然后快速播放。

GL绘制时也是这样的原理,只不过GL每次绘制的图形,称作帧。

1.2我想画背景——清屏颜色

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,再来运行

p_w_picpath007

Oh~~神马情况,怎么还是白色?



实际上,缓存已经清除了,只是GL是在后台清除的。因为,我们使用的双缓冲。


glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);


其中GLUT_DOUBLE就是设置双缓冲。



p_w_picpath008

实际上,我们清屏操作是在Back Buffer执行的,从图中可以看到,GL绘制时在Back Buffer上绘制的,然后在和前台缓冲,也就是屏幕,交换。也就是"。循环以上操作。

因此,我们还得再加上这句代码,让前后缓冲交换。


void display(){      
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);      
   glutSwapBuffers();      
}



p_w_picpath010



这下终于变黑色了。这样,我们GL的初始化工作就做好了。