欢迎光临112期刊网!
网站首页 > 论文范文 > 计算机论文 > 计算机应用 > OpenGL for Windows NT及其程序设计

OpenGL for Windows NT及其程序设计

日期:2023-01-24 阅读量:0 所属栏目:计算机应用


opengl是在sgi、microsoft、dec、ibm和intel等多家世界著名计算机公司的倡导下,基于sgi的gl标准,制定的一个通用共享的开放式三维图形标准。
前几年,opengl虽然是开放式的标准,但是只能在具有unix操作系统的各种昂贵的工作站之间通用;尽管工作站上的opengl性能优越、编程方便、生成图形精美逼真,但是只有少数人能体会其中乐趣,而令大多数pc机用户望尘莫及。随着计算机技术的发展,工作站与pc机的性能日趋接近。microsoft公司首先将opengl图形库链接到windows nt中,目前又将opengl动态库挂到最新windows 95上,这样,广大pc机用户就可充分享受opengl的乐趣了。更令人高兴的是,目前国内外出现了专门对opengl进行硬件加速的三维图形加速卡。这样,普通用户只
要拥有一台pentium 90以上、16mb ram、520mb以上硬盘容量的pc机以及一台43cm以上的大屏幕监视器和一块opengl三维图形加速卡组成的系统,就能与图形工作站相媲美,但价格却便宜数十倍。
本文作者一直从事计算机图形应用开发工作。原来是在sgi工作站上利用opengl开发图形程序,后来又首先在国内第一块三维图形加速卡agc-3d上基于windows nt的visual c++2.0环境下继续进行开发。在开发过程中,同一opengl程序几乎不用修改就能在两个平台间来回移植,效果甚好。

一、opengl特点及功能
opengl是一个开放的三维图形软件包,它独立于窗口系统和操作系统,能十分方便地在各平台间移植。
opengl具有七大功能。
(1)建模 opengl图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(如球、锥、多面体、茶壶等)以及复杂曲线和曲面(如bezier、nurbs等曲线或曲面)绘制函数。
(2)变换 opengl图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比和镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。
(3)颜色模式设置 opengl颜色模式有两种,即rgba模式和颜色索引(color index)。
(4)光照和材质设置 opengl光有辐射光(emitted light)、环境光(ambientlight)、漫反射光(diffuse light)和镜面光(specular light)。材质是用光反射率来表示。场景(scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
(5)纹理映射(texure mapping) 利用opengl纹理映射功能可以十分逼真地表达物体表面细节。
(6)位图显示和图像增强 图像功能除了基本的拷贝和像素读写外,还提供了融合(blending)、反走样(antialiasing)和雾(fog)的特殊图像效果处理。
(7)双缓存(double buffering)动画 双缓存即前台缓存和后台缓存,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用opengl还能实现深度暗示(depth cue)、运动模糊(motion blur)等特殊效果。

二、opengl for windows nt图形库
opengl图形库一共有100多个函数。其中核心函数有115个,它们是最基本的函数,其前缀是gl;opengl实用库(opengl utility library,glu)的函数功能更高一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个,前缀为glu; opengl辅助库(opengl auxiliary library,glaux)的函数是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个,前缀为aux。
此外,还有六个wgl函数非常重要,专用于opengl和windows nt窗口系统的连接,其前缀为wgl,主要用于创建和选择图形操作描述表(rendering contexts)以及在窗口内任一位置显示字符位图。这些功能是windows nt对opengl的唯一补充,见表1所示。
表1 管理图形操作描述表的wgl函数
另外,还有五个win32函数用来处理像素格式(pixel formats)和双缓存。由于它们是对win32系统的扩展,因此不能应用在其他opengl平台上,见表2所示。
表2 管理像素格式win32函数

三、opengl for windows nt程序设计
opengl for windows nt的程序设计与opengl for unix的程序设计有一点小区别,关键就在于如何将opengl与不同操作系统下的窗口系统连接起来。如果调用opengl辅助库窗口管理函数,则不用考虑这些问题。下面将主要介绍在windows nt下opengl的程序设计关键。

1.图形操作描述表
在windows nt下窗口程序必须首先处理设备描述表(device contexts,dc),dc包含许多如何在窗口上显示图形的信息,即指定画笔和刷子的颜色,设置绘图模式、调色板、映射模式以及其他图形属性。同样,opengl for windows nt的程序也必须使用dc,这与其他windows程序类似。但是,opengl for windows nt必须处理特殊的dc图形操作描述表,这是dc中专为opengl使用的一种。一个opengl应用图形操作描述表内有opengl与windows nt窗口系统相关的各种信息。一个opengl应用首先必须创建一个图形操作描述表,然后再启动它,最后在所定义的窗口内按常规方式调用opengl函数绘制图形。
一个图形操作描述表不同于其他dc,它们调用每个gdi函数都需要一个句柄,而图形操作描述表方式下只需一个句柄就可任意调用opengl函数。也就是说,只要当前启用了某个图形操作描述表,那么在未删除图形操作描述表之前可以调用任何opengl函数,进行各种操作。

2.像素格式
在创建一个图形操作描述表之前,首先必须设置像素格式。像素格式含有设备绘图界面的属性,这些属性包括绘图界面是用rgba模式还是颜色表模式,像系缓存是用单缓存还是双缓存,以及颜色位数、深度缓存和模板缓存所用的位数,还有其他一些属性信息。
(1)像素格式结构
每个opengl显示设备都支持一种指定的像素格式号。一般用一个名为pixelformatdescriptor的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。win32定义的pixelformatdescriptor如下所示:
typedef struct tagpixelformatdescriptor
{
word nsize;
word nversion;
dword dwflags;
byte ipixeltype;
byte ccolorbits;
byte credbits;
byte credshift;
byte cgreenbits;
byte cgreenshift;
byte cbluebits;
byte cblueshift;
byte calphabits;
byte calphashift;
byte caccumbits;
byte caccumredbits;
byte caccumgreenbits;
byte caccumbluebits;
byte caccumalphabits;
byte cdepthbits;
byte cstencilbits;
byte cauxbuffers;
byte ilayertype;
byte breserved;
dword dwlayermask;
dword dwvisiblemask;
dword dwdamagemask;
}

pixelformatdescriptor,
*ppixelformatdescriptor,
far *lppixelformatdescriptor;
(2)初始化pixelformatdescriptor结构
pixelformatdescriptor中每个变量值的具体含义和设置可以参
考有关资料,下面举出一个pixelformatdescriptor初始化例子来简要
说明相关变量的意义。定义pixelformatdescriptor结构的pfd如下:
pixelformatdescriptor pfd=
{
sizeof(pixelformatdescriptor),//结构尺寸
l, //结构版本
pfd-draw-to-windows|pfd-support-opengl,//特性标志
pfd-type-rgba,//rgba模式
24,//24位颜色
0,0,0,0,0,0,//不涉及这些属性
0,0,0,0,0,0,0,//没有alpha缓存和累积缓存
32,//32位深度缓存
0,0,//没有模板缓存和辅助缓存
pfd-main-plane,//主层类型
0,//保留结构数
0,0,0,//不支持结构数
};
在这个结构里,前两个变量的含义十分明显。第三个变量dwflags的值是pfd-draw-to-windows|pfd-support-opengl,表明应用程序使用opengl函数来绘制窗口,第四个表明当前采用rgba颜色模式,第五个采用24位真彩色,即1.67千万种颜色,如果是256色系统则自动实现颜色抖动;因为没有使用alpha缓存和累积缓存,所以从变量calphabits到caccumalphabits都设置为0;深度缓存设置为32位,这个缓存能解决三维场景的消隐问题;变量cauxbuffers设置为0,在windows nt下不支持辅助缓存;windows nt下针对opengl变量ilayertype只能设置为pfd-main-plane,但其他平台也许支持pfd-overlay-plane或pfd-underla
y-plane;接下来breserved变量只能设为0,而最后三个变量windows nt都不支持,故全设置成0。
(3)设置像素格式
当初始化pixelformatdescriptor结构后,就要设置像素格式。下面几段从vc++ 2.0的mfc程序中摘出的代码就是设置像素格式的方式。代码如下:
cclientdc clientdc(this);
int pixelformat=choosepixelformat(clientdc.m-hdc,&pfd);
bool result=setpixelformat(clientdc.m-hdc,pixelformat,&p
fd);
第一行语句说明得到一个应用窗口客户区的设置描述表。
第二行调用choosepixelformat()选择一个像素格式,并将像素格式索引号返回给pixelformat变量;函数中第一个参数是选择像素格式的设置描述表的句柄,第二个参数是pixelformatdescriptor结构的地址。如果调用失败则返回0;否则返回像素格式索引号。
第三行调用setpixelformat()设置像素格式,三个参数分别是设备描述表的句柄、像素格式索引号和pixelformatdescriptor结构的地址。如果调用成功则返回ture;否则返回false。

3.创建图形操作描述表
正如前所述,必须创建图形操作描述表并启用它后,才能调用opengl函数在窗口内进行各种图形操作。一般说来,利用mfc中增补的管理图形操作描述表方法来编程比较方便。下面举一例:
int copenglview:: oncreate(lpcreatestruct lpcreatestruct
)
{
if(cview::oncreate(lpcreatestruct)==-1)return -1;
// todo: add your specialized creation code here
pixelformatdescriptor pfd=
{
sizeof(pixelformatdescriptior),
//structure sizel,
//structure version number
pfd-draw-to-windows|pfd-support-opengl,//property flags
pfd-type-rgba, //rgba mode
24, //24bit color
0,0,0,0,0,0, //not concerned with these
0,0,0,0,0,0,0, //no alpha or accum buffer
32, // 32bit depth buffer
0,0, //no stencil or aux buffer
pfd-main-plane, //main layer type
0, //reserved
0,0,0 //unsupported
};
cclientdc clientdc(this);
int pixelformat=choosepixelformat(clientdc.m-hdc,&pfd);
bool result=setpixelformat(clientdc.m-hdc,pixelformat,&p
fd);
m-hrc=wglcreatecontext(clientdc.m-hrc);
return 0;
}
void copenglview::ondraw(cdc *pdc)
{
copengldoc* pdoc=getdocument();
assert-vaild(pdoc);
//todo: add draw code for native data here
wglmakecurrent(pdc->m-hdc,m-hdc);
drawmyopengl();
wglmakecurrent(pdc->m-hdc,null);
}
void copenglview::ondestroy()
{
cview::ondestroy();
// todo: add your message handler code here
wgldeletecontext(m-hrc);
}
在程序中,响应wm-create消息的函数oncreate()仅仅只创建一个临时的dc,当函数返回时,它自动删除。因此,在这里不可能启用图形操作描述表。当应用程序的窗口内容得到更新后,mfc就调用ondraw()函数,在此启用图形操作描述表wglmakecurrent()有效。然后,再调用自己用opengl写的绘图函数drawmyopengl(),则程序就可进行任意的opengl图形操作了。当绘图结束后,再调用一次wglmakecurrent(),但第二个参数设为null,意思是启用图形操作描述表无效,关闭图形操作描述表。最后,当应用程序结束时,mfc就调用ondestroy()函数来响应
wm-destroy消息,其中只需调用wgldeletecontext()来删除图形操作描述表。因为所创建和破坏的dc只响应wm-paint消息,所以在程序的末尾没有删除dc。
以上介绍的是opengl for windows nt的基本程序框架,有兴趣的读者不妨试一试。opengl具有很大的发展前途,尤其opengl for windows nt或opengl for windows 95以及不久将来的opengl for dos都是令广大pc用户感到十分高兴和开拓眼界的事情,但愿opengl在中国大地上迅速发展起来。

本文链接:http://www.qk112.com/lwfw/jsjlw/jisuanjiyingyong/244264.html

论文中心更多

发表指导
期刊知识
职称指导
论文百科
写作指导
论文指导
论文格式 论文题目 论文开题 参考文献 论文致谢 论文前言
教育论文
美术教育 小学教育 学前教育 高等教育 职业教育 体育教育 英语教育 数学教育 初等教育 音乐教育 幼儿园教育 中教教育 教育理论 教育管理 中等教育 教育教学 成人教育 艺术教育 影视教育 特殊教育 心理学教育 师范教育 语文教育 研究生论文 化学教育 图书馆论文 文教资料 其他教育
医学论文
医学护理 医学检验 药学论文 畜牧兽医 中医学 临床医学 外科学 内科学 生物制药 基础医学 预防卫生 肿瘤论文 儿科学论文 妇产科 遗传学 其他医学
经济论文
国际贸易 市场营销 财政金融 农业经济 工业经济 财务审计 产业经济 交通运输 房地产经济 微观经济学 政治经济学 宏观经济学 西方经济学 其他经济 发展战略论文 国际经济 行业经济 证券投资论文 保险经济论文
法学论文
民法 国际法 刑法 行政法 经济法 宪法 司法制度 法学理论 其他法学
计算机论文
计算机网络 软件技术 计算机应用 信息安全 信息管理 智能科技 应用电子技术 通讯论文
会计论文
预算会计 财务会计 成本会计 会计电算化 管理会计 国际会计 会计理论 会计控制 审计会计
文学论文
中国哲学 艺术理论 心理学 伦理学 新闻 美学 逻辑学 音乐舞蹈 喜剧表演 广告学 电视电影 哲学理论 世界哲学 文史论文 美术论文
管理论文
行政管理论文 工商管理论文 市场营销论文 企业管理论文 成本管理论文 人力资源论文 项目管理论文 旅游管理论文 电子商务管理论文 公共管理论文 质量管理论文 物流管理论文 经济管理论文 财务管理论文 管理学论文 秘书文秘 档案管理
社科论文
三农问题 环境保护 伦理道德 城镇建设 人口生育 资本主义 科技论文 社会论文 工程论文 环境科学