说起编程作图,大概还有很多人想起 TC 的#include <graphics.h>吧?
但是各位是否想过,那些画面绚丽的 PC 游戏是如何编写出来的?就靠 TC 那可怜的 640*480 分辨率、16
色来做吗?显然是不行的。
本帖的目的是让大家放弃 TC 的老旧图形接口,让大家接触一些新事物。
OpenGL 作为当前主流的图形 API 之一,它在一些场合具有比 DirectX 更优越的特性。
1、与 C 语言紧密结合。
OpenGL 命令最初就是用 C 语言函数来进行描述的,对于学习过 C 语言的人来讲,OpenGL 是容易理解和
学习的。如果你曾经接触过 TC 的 graphics.h,你会发现,使用 OpenGL 作图甚至比 TC 更加简单。
2、强大的可移植性。
微软的 Direct3D 虽然也是十分优秀的图形 API,但它只用于 Windows 系统(现在还要加上一个 XBOX 游
戏机) 。而 OpenGL 不仅用于 Windows,还可以用于 Unix/Linux 等其它系统,它甚至在大型计算机、各种
专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是
平台无关。
3、高性能的图形渲染。
OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对 OpenGL 提供强力支持,激烈
的竞争中使得 OpenGL 性能一直领先。
总之,OpenGL 是一个很 NB 的图形软件接口。至于究竟有多 NB,去看看 DOOM3 和 QUAKE4 等专业游
戏就知道了。
OpenGL 官方网站(英文)
http://www.opengl.org
下面我将对 Windows 下的 OpenGL 编程进行简单介绍。
学习 OpenGL 前的准备工作
第一步,选择一个编译环境
现在Windows系统的主流编译环境有Visual Studio, Broland C++ Builder, Dev-C++等, 它们都是支持OpenGL
的。但这里我们选择 Visual Studio 2005 作为学习 OpenGL 的环境。
第二步,安装 GLUT 工具包
GLUT 不是 OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows 环境下的 GLUT 下载地址: (大小约为 150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
无法从以上地址下载的话请使用下面的连接:
http://www.sundablog.com/1.zip
Windows 环境下安装 GLUT 的步骤:
1、将下载的压缩包解开,将得到 5 个文件
2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是 VisualStudio2013,则应该是其安装目录下面
的“C:\Program Files (x86)\Windows Kits\8.1\Include\um\gl 文件夹”) 。把解压得到的 glut.h 放到这个文件夹。
3、把解压得到的 glut.lib 和 glut32.lib 放到静态函数库所在文件夹(如果是 VisualStudio2013,则应该是其安
装目录下面的“C:\Program Files (x86)\Windows Kits\8.1\Lib”文件夹) 。
4、把解压得到的 glut.dll 和 glut32.dll 放到操作系统目录下面的 system32 文件夹内。 (典型的位置为:
C:\Windows\System32)
第三步,建立一个 OpenGL 工程
这里以 VisualStudio2013 为例。
选择 File->New->Project,然后选择 Win32控制台程序,点击确定
第一个 OpenGL 程序
一个简单的 OpenGL 程序如下: (注意,如果需要编译并运行,需要正确安装 GLUT,安装方法如上所述)
#include <GL/glut.h> void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); <span style="white-space:pre"> </span>glFlush(); } int _tmain(int argc, char* argv[]) { <span style="white-space:pre"> </span>glutInit(&argc, argv); <span style="white-space:pre"> </span>glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); <span style="white-space:pre"> </span>glutInitWindowPosition(100, 100); <span style="white-space:pre"> </span>glutInitWindowSize(400, 400); <span style="white-space:pre"> </span>glutCreateWindow("第一个 OpenGL 程序"); <span style="white-space:pre"> </span>glutDisplayFunc(&myDisplay); <span style="white-space:pre"> </span>glutMainLoop(); <span style="white-space:pre"> </span>return 0; }
该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。
怎么样?代码还不算长吧?
首先,需要包含头文件#include <GL/glut.h>,这是 GLUT 的头文件。
本来 OpenGL 程序一般还要包含<GL/gl.h>和<GL/glu.h>,但 GLUT 的头文件中已经自动将这两个文件包含
了,不必再次包含。
然后看 main 函数。
int main(int argc, char *argv[]),这个是带命令行参数的 main 函数,各位应该见过吧?没见过的同志们请多
翻翻书,等弄明白了再往下看。
注意 main 函数中的各语句,除了最后的 return 之外,其余全部以 glut 开头。这种以 glut 开头的函数都是
GLUT 工具包所提供的函数,下面对用到的几个函数进行介绍。
1、glutInit,对 GLUT 进行初始化,这个函数必须在其它的 GLUT 使用之前调用一次。其格式比较死板,
一般照抄这句 glutInit(&argc, argv)就可以了。
2、 glutInitDisplayMode, 设置显示方式, 其中GLUT_RGB表示使用RGB颜色, 与之对应的还有GLUT_INDEX
(表示使用索引颜色) 。 GLUT_SINGLE 表示使用单缓冲, 与之对应的还有 GLUT_DOUBLE (使用双缓冲) 。
更多信息,请自己 Google。当然以后的教程也会有一些讲解。
3、glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。
4、glutInitWindowSize,这个也简单,设置窗口的大小。
5、glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,
并不立即显示到屏幕上。需要调用 glutMainLoop 才能看到窗口。
6、glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。 (这个说法不够准确,但
准确的说法可能初学者不太好理解,暂时这样说吧) 。
7、glutMainLoop,进行一个消息循环。 (这个可能初学者也不太明白,现在只需要知道这个函数可以显示
窗口,并且等待窗口关闭后才会返回,这就足够了。 )
在 glutDisplayFunc 函数中,我们设置了“当需要画图时,请调用 myDisplay 函数”。于是 myDisplay 函数就
用来画图。观察 myDisplay 中的三个函数调用,发现它们都以 gl 开头。这种以 gl 开头的函数都是 OpenGL
的标准函数,下面对用到的函数进行介绍。
1、glClear,清除。GL_COLOR_BUFFER_BIT 表示清除颜色,glClear 函数还可以清除其它的东西,但这里
不作介绍。
2、glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。
3、glFlush,保证前面的 OpenGL 命令立即执行(而不是让它们在缓冲区中等待) 。其作用跟 fflush(stdout)
类似。