OpenGL实践之第一个窗口
DionysosLai 906391500@qq.com
引言:
OpenGL 经过多年的发展,到目前为止已经发生了全新的变化,从原本已函数为中心方法,转变成已桌上技术为中心。引用《OpenGL权威指南》 第八版中一段话:
“本书的内容是颠覆性的!对于那些已经阅读过本书以前版本的读者来所,这一版完全根据OpenGL应用程序开发的最新方法和技术进行了重新。本书将经典红宝书的以函数为中心的方法,与《OpenGL着色语言》(通常也被称作”橘皮书)一书中的着色技术进行了融合。”[1]
因此,通过本系列教程,希望大家对全新的OpenGL技术有个基本的认识,并且能够初步入门,并在将来的时间,我们可以一起畅谈这方面技术。
在阅读本书时,最好手本能够有《OpenGL 权威指南》一书,每篇文章结尾,会附录书中相关知识点和阅读页码等。
准备工作:
在OpenGL中并没有特别指定任何创建和操作窗口函数。因此每一个操作系统会专门提供一个接口,这个接口绑定了OpenGL和其窗口系统。Microsoft提供了WGL,MacOS提供了CGL。
GLUT库(OpenGL Utility Tookit)可以直接操作这些接口并在窗口中显示图形,有了这个库,我们就可以从图形接口中解放出来。GLUT原本是红宝书第二版中的示例程序。自那以后,由于其简单、跨平台的特点,使其在各种应用中广泛应用[3] 。 freeglut是Glut库的一个 开源实现。
配置工作:
Windows:
下载freeglut:https://sourceforge.net/projects/freeglut/files/latest/download
解压只用,看下文档 README.win32。使用 CMake 创建vs项目文件。然后使用vs2013软件编译项目文件。下一步开始配置工作。
把include\GL里面所有的.h文件复制到D:\Microsoft Visual Studio 10.0\VC\include文件夹,需要创建GL文件夹
把bin里面的freeglut.dll复制到C:\Windows\System32文件夹里,把freeglut.lib复制到D:\Microsoft Visual Studio 10.0\VC\lib里(注意,这里是64位机器,放在文件夹SysWOW64中,同时,dll有debug和release两个版本,使用哪个,取决于自己项目要求)[2]。
代码大纲:
#include <gl/freeglut.h>
添加freeglut 头文件。使用freeglut.h文件,就不要包含gl.h或者glu.h文件
glutInit(&argc, argv);
对GLUT进行初始化,并处理所有的命令行参数。 应该在调用其他任何GLUT函数之前调用。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
配置一些GLUT模式,GLUT_DOUBLE,开启双缓冲模式,注意开始双缓冲模式,在显示时,必须调用glutSwapBuffers(), 与值对应是GLUT_SINGLE 单缓存模式; GLUT_RGBA开始颜色RGB模式,与之对应是GLUT_INDEX,颜色索引模式。
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("01");
配置窗口参数,并创建窗口。
glClearColor(0.0, 0.0, 0.0, 0.0);
渲染并不是一个简单的过程,我们必须指定各种着色器、缓冲和标志位等。另一方面,我们经常希望在一些渲染操作中,能够保持同样的一些配置参数。因此,OpenGL采用状态机模式,并在状态机中设置保存标志位和值。
这里,我们设置了清楚帧缓存时颜色。颜色有4个通道(RGBA)值,并且值在0.0到1.0之间。
glutDisplayFunc(display);
窗口系统中,大部分的交互是通过回调函数实现。这里设置了显示回调(display callback),即GLUT在每次更新窗口内容的时候会自动调用display 函数。像回调函数,还有其他一些回调函数,比如用户输入、重设窗口尺寸等不同操作。
glutMainLoop();
这个函数将窗口控制权交给GLUT,开启内部无限无限循环。在这个循环中,函数会监听窗口和操作系统。这些监听包括窗口重绘,用户输入等。在本章中,我们注册了一个显示显示回调函数,因此我们可以渲染画面。
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
glFlush();
}
这个我们注册的显示回调函数。在这里,我们只做了最简单的帧缓冲清除工作,使用的颜色就是上面glClearColor接口中配置的颜色。glutSwapBuffers() 函数 是告诉GLUT 交换前缓存和后缓存角色。这个接口是必须调用的,因为我们之前配置GLUT模式时,开启双缓冲模式。
本章教程到此结束,下一章我们将学习如何绘制一个三角形。最后,祝大家三八节快乐了。
[延伸阅读]:
[1] 《OpenGL 编程指南》前言 第三版。
[2] http://blog.csdn.net/xuguangsoft/article/details/8002375
[3] http://baike.baidu.com/item/freeGLUT
[4]《OpenGL 编程指南》前言 第三版。P10 ~P12。