欢迎来到天天文库
浏览记录
ID:5795974
大小:189.50 KB
页数:4页
时间:2017-12-25
《opengl扩展的应用技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、OpenGL扩展的应用技术方贤勇,张佑生方贤勇,男,1978年生,硕士研究生,研究方向:计算机图形学,ICAD。张佑生,男,1941年生,教授,博士生导师,主要研究方向:计算机图形学,人工智能。(合肥工业大学计算机与信息学院,安徽合肥,230009)摘要:本文着重于OpenGL扩展的应用。在此基础上,详细阐述MsWindows环境下VC++6.0中实现的OpenGL扩展的应用技术,并通过实例加以验证。关键词:OpenGL;OpenGL扩展;应用技术中图分类号:TP391.71文献标识码:A1引言OpenGL是SGI公司推出的专业图形加
2、速卡的图形软件应用程序接口(API),它允许程序员对2D和3D几何形体进行描述,并绘制(Rendering)到帧缓存(FrameBuffer)。它的工作方式就如同一个状态机,你可以通过各种状态和模式设置控制绘制过程,达到绘制要求。OpenGL已经成为首选的2D和3D开发环境。它是低层的API,具有与硬件无关的特征,因而具有很强的可移植性。但是,硬件是不断变化的,OpenGL如何保持可移植性呢?OpenGL扩展(OpenGLExtension)正是为这一目的而设计的。厂商只要提供OpenGL扩展,就可以轻松实现硬件特有的功能。利用Ope
3、nGL扩展OpenGL实现者(OpenGLImplementer)也可以添加新的处理算法。OpenGL扩展功能强大,而实际软件开发过程中却不被注意,下面将详细介绍OpenGL扩展的应用技术。2OpenGL扩展简介OpenGL扩展其实质是硬件的驱动程序的一部分,是针对硬件的特性而新开发的。它是由硬件设计者或OpenGL库设计者按其规格说明书进行设计。不同的OpenGL实现(OpenGLImplementation)支持的扩展可能不一样。只有随着某一扩展的推广与应用以及硬件技术的提高该扩展才会在所有的OpenGL实现中被给予支持,从而最终
4、成为OpenGL标准库的一部分。图1描述了扩展的开发应用过程。向SGI审请新扩展正式成为OpenGL的一部分发布此扩展并向OpenGL实现者推广开发扩展程序编写规格说明图1图1的第2和第3阶段表明扩展的规格说明书(Specification)定义了扩展。OpenGL实现不提供扩展的具体用法,使用者只有通过阅读OpenGL扩展规格说明书才能获悉具体用法。扩展的规格说明书必须从SGI那里得到。它是用统一的格式书写以二进制文本文件形式给出。规格说明书中注明扩展的名称,增加的函数与过程,参数(Token),使用方法等等。3OpenGL扩展的应
5、用技术OpenGL实现并不都支持某一扩展,所以必须按照以下步骤进行扩展应用过程。以VC++6.0中的OpenGL为例,并假定该扩展是GL_EXT_sample,它有定义了一个新的函数是glSampleEXT(GLenumsampleenum,GLintsampleint),其中sampleenum可以取参数GL_SAMPLE_EXT,sampleint可取1.0。1)检查头文件是否对扩展作了宏定义。在VC++6.0中是以如下的结果:/*Extensions*/#defineGL_EXT_vertex_array1#d
6、efineGL_EXT_brag1#defineGL_EXT_paletted_texture1#defineGL_WIN_swap_hint1#defineGL_EXT_clip_disable1GL_EXT_sample并不一定在这里。因为这些都是较早的VC++版本中保留下来的扩展宣传(Advertisement),关键要在编译时执行检查。2)添加在编译时的检查,具体实现是这样的:#ifdefGL_EXT_sampleglSampleEXT(GL_SAMPLE_EXT,1.0)。#endif这并不能保证运行时就没有问题,因为在具体
7、的操作系统上,对不同的图形硬件的支持是不一样的。如在Win32中OpenGL.ICD驱动程序支持的就依赖于硬件和厂商的ICD驱动程序是如何实现扩展的。所以要执行运行时的检查。3)在程序中添加运行时检查的功能,用isExtensionSupported函数实现:/*extension代表要检查的扩展*/intisExtensionSupported(constchar*extension){constGLubyte*extensions=NULL;constGLubyte*start;GLubytewhere,*terminator;w
8、here=(GLubyte*)strchr(extension,′′);/*如果extension为空,则返回*/if(where
9、
10、*extension==′ ′)return0;extensions=glGetSt
此文档下载收益归作者所有