opengl学习笔记2-3-如何在windows中使用最新的opengl

来源:互联网 发布:阿里云网站建设教程 编辑:程序博客网 时间:2024/05/17 02:18

       前面的例子,介绍了如何在Windows下仅使用VSSDK自带库创建OpenGL环境的方法和例子。微软开发OpenGL的历史如此之短,之后就全力开发自己的亲儿子:DirectX。从此之后Windows平台对OpenGL的内置支持就停留在OpenGL 1.1版。当然,在Vista之后,微软甚至开发了一个OpenGLDirectX的转换层,支持到OpenGL 1.4,这使得系统在没有安装支持OpenGL的显卡驱动时仍然能够运行一部分基于OpenGL的程序。

        OpenGL并非为Windows而生,事实上在除了Windows的其它几乎所有操作系统平台上,OpenGL都扮演着更为重要的角色。

那么,在Windows平台上如何使用最新版本的OpenGL函数呢?这些函数从何而来呢?这一章主要谈论这两个问题。

2.1 访问OpenGL最新版本中的函数

        在第一章提到过,与其他任何库一样,OpenGL必须有能力操作系统中的显示设备。而现代操作系统都不允许应用直接操作硬件设备,因此对硬件的操作要么需要开发硬件驱动,要么需要使用操作系统提供的操作接口。

        微软已经差不多18年没有对OpenGL的支持做过重大更新了,显然windows操作系统不可能提供更多有关OpenGL的接口函数。这样,新的OpenGL函数只能通过驱动程序提供。

        事实也正是如此,OpenGL提供了一组规范,但这些规范不是给应用程序人员用的,是提供给显卡开发商的,根据这组规范,显卡开发商开发的显卡驱动可以提供对OpenGL的支持。比如在我的机器上,GeForce 605的显卡驱动就提供了对OpenGL4.3.0的支持。

        所有库的开发中,能够设计一个预留的“升级接口”是非常高明的,OpenGL就是如此。opengl32.dllwindows系统自带的对OpenGL驱动访问的接口库,从windows 95开始,只要装好系统它就存在。在windows 7上通过VSdumpbin.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.2 使用第三方库

         按照2.1节中的步骤去使用OpenGL在理论上是完全可行的,但在实践上存在两个主要困难:

         1)每次由程序员手工编码完成2.1节中的4个步骤是非常烦人的事情

         2)仅仅有了函数指针还是不够的,还需要知道调用这个函数所需要的数据类型,

            相关宏定义、相关枚举值,……,总之这是一个非常复杂的事情

          因此,就有了第三方库,第三方库基本上就是根据OpenGL规范,由一群非常熟悉OpenGL的人弄出来的(否则怎么能知道每个枚举值?知道每个结构体的定义?)。

          第三方库有不少,但最常见于各类书籍和代码的有两个:1glut/freeglut  2glew。当然其它的还有gleeglfw……。

2.2.1 GLEW

        Glew更多的是提供了对OpenGL扩展函数的支持。当然也包括基本OpenGL函数的支持。但它不提供其它类似窗体,键盘事件的支持函数。在与freeglut混和使用时,应该将#include <gl/glew.h>放在#include<gl/glut.h>之前,这样可以保证使用了最新版本的OpenGL函数。

      Glew又分为了glew和glew_mx,前者是单线程版,后者是线程安全版。因为OpenGL的Rendering Context限制了每线程一个。如果需要在一个程序里同时出现多个OpenGL窗口,用glew mx是更好的方案。

2.2.2 glut/freeglut

        Glutfreeglut,前者已经停止开发了,至少是进展缓慢。后者是前者的替代品,目前正在迅速开发中,能保持与最新的OpenGL一致。该库的主要优点是提供了一组简单的窗体、鼠标、键盘事件操作函数,能方便OpenGL学习程序的开发。当然该库也支持基本的OpenGL函数。

2.3 如何选择第三方库

       如果只是需要使用最新的OpenGL函数,那么就选择Glew库,这时只需要使用第1章中的知识创建好OpenGL环境,然后使用glew中导出的函数即可。

        如果想按照一些书籍上的例子进行实践,那一般是要选择freeglut或将其与glew结合使用。

        既然有了第三方库,后续的章节就不再研究如何使用“纯粹”的windows自带的OpenGL库,而是研究如何使用第三方库进行开发。


在初学阶段,选择freeglut和glew的结合,以这样的方式来完成之后的例子。至于如何配置glew的环境,在之前的文章中以有介绍。