<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:ˎ̥; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->
说起编程作图,大概还有很多人想起 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://upload.programfan.com/upfile/200607311626279.zip
Windows 环境下安装 GLUT 的步骤:
1 、将下载的压缩包解开,将得到 5 个文件
2 、在 “ 我的电脑 ” 中搜索 “gl.h” ,并找到其所在文件夹(如果是 VisualStudio2005 ,则应该是其安装目录下面的 “VC/PlatformSDK/include/gl 文件夹 ” )。把解压得到的 glut.h 放到这个文件夹。
3 、把解压得到的 glut.lib 和 glut32.lib 放到静态函数库所在文件夹(如果是 VisualStudio2005 ,则应该是其安装目录下面的 “VC/lib” 文件夹)。
4 、把解压得到的 glut.dll 和 glut32.dll 放到操作系统目录下面的 system32 文件夹内。(典型的位置为: C:/Windows/System32 )
第三步,建立一个 OpenGL 工程
这里以 VisualStudio2005 为例。
选择 File->New->Project ,然后选择 Win32 Console Application ,选择一个名字,然后按 OK 。
在谈出的对话框左边点 Application Settings ,找到 Empty project 并勾上,选择 Finish 。
然后向该工程添加一个代码文件,取名为 “OpenGL.c” ,注意用 .c 来作为文件结尾。
搞定了,就跟平时的工程没什么两样的。
第一个 OpenGL 程序
一个简单的 OpenGL 程序如下:(注意,如果需要编译并运行,需要正确安装 GLUT ,安装方法如上所述)
#include <GL/glut.h>
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow(" 第一个 OpenGL 程序 ");
glutDisplayFunc(&myDisplay);
glutMainLoop();
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) 类似。
---------------------------------------------------------------------------------------------------
欢迎访问www.3dgui.org 基于OpenGL ES建立的嵌入式系统3D界面库