<!-- /* 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界面库