《OpenGL入门学习之十四——OpenGL版本和OpenGL扩展》由会员分享,可在线阅读,更多相关《OpenGL入门学习之十四——OpenGL版本和OpenGL扩展(6页珍藏版)》请在金锄头文库上搜索。
1、入门学习之十四版本和扩展从推出到现在,已经有相当长的一段时间了。其间,不断的得到更新。 到今天为止,正式的已经有九个版本。 每个版本的推出,都增加了一些当时流行的或者迫切需要的新功能。同时, 到现在为止,是向下兼容的,就是说如果某个功能在一个低版本中存在,则 在更高版本中也一定存在。这一特性也为我们编程提供了一点方便。 当前的最新版本是,但是并不是所有的计算机系统都有这样最新 版本的实现。举例来说,系统如果没有安装显卡驱动,或者显卡驱 动中没有附带,则系统默认提供一个软件实现的,它没有使 用硬件加速,因此速度可能较慢,版本也很低,仅支持版本(听说 默认提供的支持到版本,我也不太清楚)。和这样的
2、显卡巨头, 其主流显卡基本上都提供了对的支持。但一些旧型号的显卡因为性能不足 等原因,只能支持到或者。的集成显卡,很多都只提供了 (据说目前也有更高版本的了,但是我没有见到)。 是一次比较大的改动,也因此升级了主版本号。可以认为版本 是一个分水岭,是否支持版本,直接关系到运行程序时的效果。 如果要类比一下的话,我觉得和的差距,就像是和 的差距了。 检查自己的版本 可以很容易的知道自己系统中的版本,方法就是调用 函数。版本:会返回一个表示版本的字符串,字符串的格式为,就 是三个整数,用小数点隔开,第一个数表示主版本号,第二个数表示 次版本号,第三个数表示厂商发行代号。比如我在运行时得到的是,这表
3、示我 的版本为(主版本号为 ,次版本号为 ),是厂商的第一个发行版本。 通过 函数,也可以把字符串分成三个整数,以便详细的进行判断。版本: 主版本号: 次版本号: 发行版本号:还可以取得其它的字符串。 返回的提供厂商。 返回执行渲染的设备,通常就是显卡的名字。 返回所支持的所有扩展,每两个扩展之间用空格隔开。 “详细情况参见下面的关于”扩展 的叙述。 版本简要历史 版本不同,提供功能的多少就不同。这里列出每个版本推出时,所增加的主 要功能。当然每个版本的修改并不只是下面的内容,读者如果需要知道更详细的情形, 可以查阅标准。顶点数组。把所有的顶点数据(颜色、纹理坐标、顶点坐标等)都放到数组中,可
4、以 大大的减少诸如本的各种功能,可以满足你的一部分要求。 扩展 版本的更新并不快。如果某种技术变得流行起来,但是标准中又没有 相关的规定对这种技术提供支持,那就只能通过扩展来实现了。 厂商在发行时,除了遵照标准,提供标准所规定的各种功能外,往 往还提供其它一些额外的功能,这就是扩展。 扩展的存在,使得各种新的技术可以迅速的被应用到“”中。比如 多重纹理 , 它是在中才被加入到标准中的,在出现以前,很多实 “”现都通过扩展来支持 多重纹理 。这样,即使版本不更新,只要增加新的扩 展,也可以提供新的功能了。这也说明,即使版本较低,也不一定不支持一 些高版本才提供的功能。实际上某些的实现,也可能提供
5、了最新 的版本所规定的大部分功能。 当然扩展也有缺点,那就是程序在运行的时候必须检查每个扩展功能是否被支持,导 致编写程序代码复杂。 扩展的名字 每个扩展,都必须向的网站注册,确认后才能成为扩展。注册后的 扩展有编号和名字。编号仅仅是一个序号,名字则与扩展所提供的功能相关。 名字用下划线分为三部分。举例来说,一个扩展的名字可能为:, 其意义如下: 第一部分为扩展的目标。比如表示这是一个扩展。如果是则表示这 是一个针对的扩展,如果是则表示这是一个针对的 系统的扩展。 第二部分为提供扩展的厂商。比如表示这是公司所提供的扩展。相应的还 有等。 剩下的部分就表示扩展所提供的内容了。比如,表示半精度的浮
6、点数,每个 浮点数的精度只有单精度浮点数的一半,因此只需要两个字节就可以保存。这种扩展 功能可以节省内存空间,也节省从内存到显卡的数据传输量,代价就是精确度有所降 低。扩展和扩展 最初的时候,每个厂商都提供自己的扩展。这样导致的结果就是,即使是提供相同的 功能,不同的厂商却提供不同的扩展,这样在编写程序的时候,使用一种功能就需要 依次检查每个可能支持这种功能的扩展,非常繁琐。 于是出现了扩展和扩展。 “”扩展是由多个厂商共同协商后形成的扩展,在扩展名字中, 提供扩展的厂商 一 栏将不再是具体的厂商名,而是三个字母。比如,就是一个 扩展。 扩展不仅是由多个厂商共同协商形成,还需要经过体系结构审核
7、委员会 (即“”)的确认。在扩展名字中, 提供扩展的厂商 一栏不再是具体的厂商名字, 而是三个字母。比如,就是一个扩展。 通常,一种功能如果有多个厂商提出,则它成为扩展。在以后的时间里,如果 经过了确认,则它成为扩展。再往后,如果的维护者认为这种功 能需要加入到标准规定中,则它不再是扩展,而成为标准的一部分。 例如,就是先有,再有 ,最后到版本时,这个功能为标准规定必须提供 的功能,不再是一个扩展。 在使用所提供的功能时,应该按照标准功能、扩展、扩展、其它扩 展这样的优先顺序。例如有扩展支持这个功能时,就不使用扩展。 在程序中,判断是否支持某个扩展 前面已经说过,会返回当前所支持的所有扩展的
8、名字,中间用空格分开,这就是我们判断是否支持某个扩展的依据。判断是否支持某个指定的扩展 若支持,返回 。否则返回 。上面这段代码,判断了是否支持指定的扩展,可以看到,判断时完全是靠字 符串处理来实现的。循环检测,找到第一个空格,然后比较空格之前的字符串是否与 指定的名字一致。若一致,说明扩展是被支持的;否则,继续比较。若所有内容都比 较完,则说明扩展不被支持。 编写程序调用扩展的功能 扩展的函数、常量,在命名时与通常的函数、常量有少许区别。那就是扩展 的函数、常量将以厂商的名字作为后缀。 比如扩展,所有扩展的函数,函数名都以结尾,常量名都以结 尾。例如: (函数) (常量) 如果已经知道支持某
9、个扩展,则如何调用扩展中的函数?大致的思路就是利 用函数指针。但是不幸的是,在不同的操作系统中,取得这些函数指针的方法各不相 同。为了能够在各个操作系统中都能顺利的使用扩展,我向大家介绍一个小巧的工具: 。 是一个开放源代码的项目,可以从网络上搜索并下载。其代码由两个文件组成, 一个是,一个是。把两个文件都放到自己的源代码一起编译,运行的时 候,可以自动的判断所有扩展是否被支持,如果支持,会自动读取对应的 函数,供我们调用。 我们自己编写代码时,需要首先包含,然后才包含(注意顺序不能调 换),然后就可以方便的使用各种扩展功能了。注意顺序,要在之前使用也可以帮助我们判断是否支持某个扩展,因此有了
10、,前面那个判 断是否支持扩展的函数就不太必要了。 示例代码 让我们用一段示例代码结束本课。 我们选择一个目前绝大多数显卡都支持的扩展,来说明如何使用 来调用扩展功能。通常我们在绘制像素时,需要用函数来 指定绘制的位置。但是,函数使用的不是屏幕坐标,例如指定不一定 是左下角,这个坐标需要经过各种变换(参见第五课,变换),最后才得到屏幕上的可以看到,使用了扩展以后,代码会简单得多了。不支持扩展 时必须使用较多的代码才能实现的功能,使用扩展后即可简单 的解决。 如果把代码修改一下,不使用扩展而直接使用里面的代码,可以发现运行效果是 一样的。 工具软件 在课程的最后我还向大家介绍一个免费的工具软件,这
11、就是 (各大软件网站均有下载,请自己搜索之),目前较新的版本是。 这个软件可以查看自己计算机系统的信息。包括版本、提供厂商、 设备名称、所支持的扩展等。 软件可以查看的信息很详细,比如查看允许的最大纹理大小、最大光源数目等。 在查看扩展时,可以在最下面一栏输入扩展的名字,按下回车后即可连接到 官方网站,查找关于这个扩展的详细文档,非常不错。 可以根据电脑的配置情况,自动连接到对应的官方网站,方便下载最新驱动。(比如 我是的显卡,则连接到的驱动下载页面) 可以进行测试,看看运行起来性能如何。 可以给出总体报告,如果一些比较重要的功能不被支持,则会用粗体字标明。 软件还带有一个数据库,可以查询各厂商、各型号的显卡对各种扩展的支持情况。 小结本课介绍了版本和扩展。 从诞生到现在,经历了这些版本。 每个系统中的版本可能不同。使用可以查看当前的 版本。 新版本的将兼容旧版本的,同时提供更多的新特性和新功能。 在实现时可以通过扩展,来提供额外的功能。 扩展有厂家扩展、扩展、扩展。通常应该尽量使用标准功能,其次 才是扩展、扩展、厂家扩展。 是一个可以免费使用的工具,使用它可以方便的判断当前的是否支持 某扩展,也可以方便的调用扩展。 是一个软件,可以检查系统所支持的版本、支持的扩 展、以及很多的详细信息。