前面的例子,介绍了如何在Windows下仅使用VS或SDK自带库创建OpenGL环境的方法和例子。微软开发OpenGL的历史如此之短,之后就全力开发自己的亲儿子:DirectX。从此之后Windows平台对OpenGL的内置支持就停留在OpenGL 1.1版。当然,在Vista之后,微软甚至开发了一个OpenGL到DirectX的转换层,支持到OpenGL 1.4,这使得系统在没有安装支持OpenGL的显卡驱动时仍然能够运行一部分基于OpenGL的程序。
OpenGL并非为Windows而生,事实上在除了Windows的其它几乎所有操作系统平台上,OpenGL都扮演着更为重要的角色。
那么,在Windows平台上如何使用最新版本的OpenGL函数呢?这些函数从何而来呢?这一章主要谈论这两个问题。
在第一章提到过,与其他任何库一样,OpenGL必须有能力操作系统中的显示设备。而现代操作系统都不允许应用直接操作硬件设备,因此对硬件的操作要么需要开发硬件驱动,要么需要使用操作系统提供的操作接口。
微软已经差不多18年没有对OpenGL的支持做过重大更新了,显然windows操作系统不可能提供更多有关OpenGL的接口函数。这样,新的OpenGL函数只能通过驱动程序提供。
事实也正是如此,OpenGL提供了一组规范,但这些规范不是给应用程序人员用的,是提供给显卡开发商的,根据这组规范,显卡开发商开发的显卡驱动可以提供对OpenGL的支持。比如在我的机器上,GeForce 605的显卡驱动就提供了对OpenGL4.3.0的支持。
所有库的开发中,能够设计一个预留的“升级接口”是非常高明的,OpenGL就是如此。opengl32.dll是windows系统自带的对OpenGL驱动访问的接口库,从windows 95开始,只要装好系统它就存在。在windows 7上通过VS的dumpbin.exe查看opengl32.dll可以看到它导出了368个函数。
其中:
125 7C 00003CED glGetString
356 163 0003C245 wglGetProcAddress
这两个函数非常重要,glGetString函数在第一章中已经使用过了,利用它可以了解系统中OpenGL相关的各种信息。
wglGetProcAddress也是个非常重要的函数,通过给出OpenGL函数名,就可以利用wglGetProcAddress获取函数指针,从而可以访问到openGL最新版本中的所有函数。
注意:只要opengl32.dll能支持的OpenGL函数,当应用程序调用时,OpenGL32.dll总是将其“转发”给显卡驱动的实现,因此总是最新的实现,而不是1.1版本的实现。
现在,可以整理一个在windows平台使用OpenGL最新版本函数的步骤:
1) 使用第1章中的知识点创建OpenGL环境
2) 从OpenGL官方网站或任何其它文档中查找OpenGL函数名
3) 调用wglGetProcAddress(“functionname”)获得函数地址
4) 组织参数,利用函数指针调用特定函数
按照2.1节中的步骤去使用OpenGL在理论上是完全可行的,但在实践上存在两个主要困难:
1)每次由程序员手工编码完成2.1节中的4个步骤是非常烦人的事情
2)仅仅有了函数指针还是不够的,还需要知道调用这个函数所需要的数据类型,
相关宏定义、相关枚举值,……,总之这是一个非常复杂的事情
因此,就有了第三方库,第三方库基本上就是根据OpenGL规范,由一群非常熟悉OpenGL的人弄出来的(否则怎么能知道每个枚举值?知道每个结构体的定义?)。
第三方库有不少,但最常见于各类书籍和代码的有两个:1)glut/freeglut 2)glew。当然其它的还有glee、glfw……。
Glew更多的是提供了对OpenGL扩展函数的支持。当然也包括基本OpenGL函数的支持。但它不提供其它类似窗体,键盘事件的支持函数。在与freeglut混和使用时,应该将#include
Glew又分为了glew和glew_mx,前者是单线程版,后者是线程安全版。因为OpenGL的Rendering Context限制了每线程一个。如果需要在一个程序里同时出现多个OpenGL窗口,用glew mx是更好的方案。
Glut和freeglut,前者已经停止开发了,至少是进展缓慢。后者是前者的替代品,目前正在迅速开发中,能保持与最新的OpenGL一致。该库的主要优点是提供了一组简单的“窗体、鼠标、键盘事件”操作函数,能方便OpenGL学习程序的开发。当然该库也支持基本的OpenGL函数。
如果只是需要使用最新的OpenGL函数,那么就选择Glew库,这时只需要使用第1章中的知识创建好OpenGL环境,然后使用glew中导出的函数即可。
如果想按照一些书籍上的例子进行实践,那一般是要选择freeglut或将其与glew结合使用。
既然有了第三方库,后续的章节就不再研究如何使用“纯粹”的windows自带的OpenGL库,而是研究如何使用第三方库进行开发。
在初学阶段,选择freeglut和glew的结合,以这样的方式来完成之后的例子。至于如何配置glew的环境,在之前的文章中以有介绍。