技术讲座
《O p enGL三维图形程序设计》系列讲座
第二讲OpenGL基本编程
1 O p enGL函数库及简单例程
1.1OpenGL函数库
OpenGL是一个针对图形硬件的软件接口(Softw are In terface)。它包括100多个图形操作函数,分属于三个基本图形库,即基础库、实用库、辅助库。OpenGL基础库是Op enGL最底层的图形函数库,它提供大量的几何图原和图象单元的操作,约含115个函数,函数前缀为gl,列于头文件
1.2OpenGL简单例程举例
首先运用Op enGL辅助库的窗口管理功能来讲解一个简单的Op enGL图形应用实例,这个例程将在屏幕中央绘制一个带光照的光滑明暗处理的黄色的球体。程序ball.c如下:
#include
#include
#include
vo id m yin it(vo id);
vo id CALLBA CK m yR eshape(GL sizeiw,GL2 sizei h);
vo id CALLBA CK disp lay(vo id);
vo id m yin it(vo id) 初始化深度缓存,实现场景三维物体自动消隐
{ gl D ep thFunc(GL L ESS);
glEnab le(GL D EPTH T EST);
}
vo id CALLBA CK disp lay(vo id)
{ glC lear(GL COLOR BU FFER B IT GL D EPTH BU FFER B IT);
glCo lo r3f(1.0,1.0,0.0); 定义物体颜色
auxSo lidSphere(1.0); 绘制球体
glF lu sh();
}
vo id CALLBA CK m yR eshape(GL sizeiw,GL2 sizei h)
{ gl V iew po rt(0,0,w,h); 设置视口
gl M atrix M ode(GL PROJECT I ON); 启用投影变换矩阵
gl L oad Iden tity(); 矩阵单位化
进行平行投影变换
if(w≤h)
gl O rtho(-1.5,1.5,-1.53(GL float)h (GL float)w,
1.53(GL float)h (GL float)w,-10.0,10.
0);
else
gl O rtho(-1.53(GL float)w (GL float)h,
1.53(GL float)w (GL float)h,-1.5,1.5, -10.0,10.0);
gl M atrix M ode(GL M OD ELV IE W); 启用模型变换矩阵
gl L oad Iden tity();
}
vo id m ain(vo id)
{ aux In itD isp lay M ode(AU X S I N GL E AU X R GBA AU X D EPTH16);
aux In itPo siti on(0,0,500,500);
aux In it W indow(“OpenGL D em o”);
m yin it();
auxR eshapeFunc(m yR eshap e);
aux M ainL oop(disp lay);
}
1.3例程说明
以上例程包括了OpenG L图形操作的基本步骤,下面我们主要介绍窗口管理部分的函数功能。其他有关变换、光照、材质等将在后续讲座中一一详细介绍,读者也可以参阅《OpenG L三维图形程序设计》一书(有关书的详细情况请与中国图象图形学会或北京黎明电子技术有限公司联系)。
在例程的主函数ma i n()中包含了窗口定义、窗口模式设置、窗口重置等函数调用。
◇aux I n it D isplay M ode()设置窗口显示模式为RGBA方式,即彩色方式,并且图形缓存为单缓存(SING L E BUFFER)。
◇aux I n itPosition()定义窗口的初始位置,前两个参数(0,0)为窗口的左上角点的屏幕坐标,后两个参数(500,500)为窗口的宽度和高度。
◇aux I n it W i ndow()窗口初始化,字符参数是窗口名称。
◇auxReshapeFunc()窗口大小改变时重新定义场景形状尺寸。参数m yReshape是一个函数指针。这个函数带有两个参数,即窗口改变后的新宽度和新高度。
◇aux M a i nL oop()循环绘制场景,参数d isplay 即为场景绘制函数。当窗口需要更新或场景发生改变时,程序便调用d isplay,更新绘制场景。
从以上例程可以看出,利用OpenG L可以很方便地进行三维场景的实时渲染,并不需要自己编写大量的光影计算、消隐计算以及各种变换等程序。尤其在AGC-G L卡的加速下,使得许多以前在微机上无法实现的实时显示等功能都能很容易地实现。
2 OpenG L for W i ndows NT 95基本接口编程
W i ndows NT下已经随NT的安装就带上了OpenG L的几个动态连接库,读者可在NT目录下的S Y STE M32子目录中查到glu32.dll、opengl32. dll等。但是,目前的W i ndows95下并没有直接带上这些连接库,必须再单独将专门的OpenG L for W i ndows95的DLL考入W i ndows95目录下的S Y STE M子目录中去。注意,OpenG L for W i ndows 95的DLL与OpenG L for W i ndows NT的DLL不同。但二者编程及运行机制都一样,两个操作系统下的执行文件可以通用。
在96年第6期《PC WOR LD》上的《OpenG L for W i ndows NT及其程序设计》有详细的介绍,这里只归纳总结一下利用VC的M FC类库使OpenG L与W i ndows NT或W i ndows95接口的基本方法和步骤,并举出一个完整的例子。
2.1 W i ndows NT 95下的OpenG L函数
W i ndows NT下的OpenG L同样包含100多个库函数,这些函数都按一定的格式来命名,即每个函数都以gl开头。W i ndows NT下的OpenG L除了具有基本的OpenG L函数外,还支持其他两类函数:
(1)W i ndows专用库函数(W G L):6个函数,每个函数以wgl开头;
(2)W i n32AP I函数:5个函数,函数前面没有专用前缀;
6个W G L函数用于连接OpenG L和W i ndows NT 95。这些函数用于W i ndows NT 95环境下的OpenG L窗口能够进行渲染着色,在窗口内绘制位图字体以及把文本放在窗口的某一位置等。这些函数把W i ndows和OpenG L揉合在一起;最后的5个W i n32函数用于处理象素存储格式和双缓存,显然这些函数仅仅能够用于W i n32系统而不能用于其他OpenG L平台。
2.2 OpenG L for W i ndows NT 95程序设计基本
步骤
下面通过一个例子具体讲述利用VC的M FC 类库编写OpenG L for W i ndows NT 95的基本步骤:
① 打开VC的F ile,选择New,建立一个名为test的M AK文件。
② 打开Project的F iles,将VC目录下的L IB 子目录中的glaux.l ib、glu32.l ib和opengl32.l ib三个OpenG L库添加到test.mak中去。
③ 打开M FC对话框,在Cla ss Nam e栏中选择CTestV iew类:
(1)选择WM CREATE消息,单击Ed it Code,然后将以下代码加到函数OnCrea te()中去: P IXEL F OR M AT D ESCR IPT OR pfd=
{
sizeof(P IXEL F OR M AT D ESCR IPT OR),
Structure size.
1, Structure version nu m ber.
PF D D RA W T O W INDOW
Property f lags.
PF D SUPPORT OPENG L,
PF D T Y PE RGBA,
24, 24-b it color.
0,0,0,0,0,0,
Not concerned with these.
0,0,0,0,0,0,0,
No a lpha or accu m buffer.
32, 32-b it depth buffer.
0,0, No stenc il or aux buffer.
PF D M A IN PLANE,
M a i n layer type.
0, Reserved.
0,0,0 Un supported.
};
CCl ien t DC cl ien t DC(th is);
i n t p ixelFor ma t=ChooseP ixelFor ma t(cl ien t-DC.m h DC,&pfd);
B OOL success=SetP ixelFor ma t(cl ien t DC.m
h DC,p ixelFor ma t,&pfd);
m hRC=wglCrea teCon text(cl ien t DC.m
h DC);
(2)选择WM D EST OR Y消息,加入代码
wgl D eleteCon text(m hRC);
(3)继续选择视窗(V iew)类的PreCrea te W i n-dow()函数,加入代码
cs.style =W S CL IPCH I D REN W S CL IPSIB L INGS;
4 在testv iew.cpp文件中,将以下代码加入到CTestV iew类的OnD raw()函数中去:
wgl M akeCurren t(p DC->m h DC,m hRC);
D raw M y OpenG L();
wgl M akeCurren t(p DC->m h DC, NULL);
然后,在testv iew.CPP末尾添加上具体的OpenG L应用函数,即:
Vo id CTestV iew::D raw M y OpenG L()
{
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear(G L COLOR BUFFER B IT);
glColor3f(1.0f,0.0f,0.0f);
glBeg i n(G L L INES); 绘制一条红色线段
glVertex2f(0.2f,0.4f); glVertex2f (0.8f,0.4f); glEnd();
glFlush();
}
⑤ 在testv iew.h中,需要加上一些头文件和类成员的说明:
(1)加上头文件#i nclude
(2)在CTestV iew类中的CTest D oc3Get D ocu-m en t()行后加上
protected:
HG L RC m hRC;
(3)在protected关键词后加上Vo id D raw M y-OpenG L();
这样,就可以对test程序进行编译、连接、运行了。其结果是在一个窗口中画一条红色的线段。这是利用VC的M FC类库使OpenG L与W i ndows NT或W i ndows95接口的最简单的一个例子。只要接口会了,则以后的OpenG L for NT 95的应用程序设计思路和方法就如同UN IX环境下的一样,只是窗口系统不一而已。
(廖朵朵)
(联系方式:Tel:(010)62312455,62312456
Fax:(010)62312178E-M a il:sun step@publ https://www.wendangku.net/doc/3b2258507.html,)