OpenGL(试用篇)——第一个OpenGL程序(1)

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

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

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

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

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

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

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

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

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

2、第一个OpenGL程序

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

p_w_picpath002



1利用glut建立窗口

既然学的是OpenGL,也就不必纠结什么Win32窗口编程之类的旁枝细节,恰好glut为咱们提升提供良好的平台,几句代码就能建立一个窗口,之后的工做都会在这个窗口里进行。3d




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



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的初始化工做就作好了。

相关文章
相关标签/搜索