一个不愿意付出的男人:OpenGL的版本及各种库 - 孤浪涯的日志 - 网易博客

来源:百度文库 编辑:中财网 时间:2024/05/04 17:05:47

OpenGL的版本及各种库

Computer Graphics 2010-07-08 15:57:33 阅读36 评论0   字号: 订阅

Microsoft都不想支持OpenGL了哈,所以Windows下OpenGL都停留在1.1的版本,更甚的好像是Win7就根本没有给装OpenGL,因为我装完Win7的时候OpenGL工程是找不到头文件的,要自己去下载,遥想当时找了半天也找不到下载地址,想想竟然使用这么广泛的东西竟然没有官方网站可以去下载的,还是从什么乱七八糟的地方下载了一个压缩包,里面有gl、glu、glut、glaux、alext、wglext,版本未知,可以从这下载到。由于有太多的版本和扩展库了,太乱了,虽然看到很多介绍,但是过一段时间总免不了忘了。还是把他们都列出来吧:

(1)OpenGL核心库

也就是gl.h、opengl32.lib、opengl.dll了。最核心的库了,OpenGL程序肯定要用到这个库啦。里面是最基本的图元操作,如点、线什么的。

(2)GLU辅助库

也就是glu.h、glu32.lib、glu.dll了。是仅次于核心库的库了,是所有OpenGL的标准中都会包含的,所以肯定是要有这个库啦。这个库其实也没做什么东西,就是用核心库中的函数包装了一下,有一些功能更强大的函数,如gluSphere()一下就可以画个圆了,可是要在核心库中估计得半天。

(3)GLUT窗口管理库

也就是glut.h、glut32.lib、glut32.dll了。OpenGL是与窗口管理系统无关的,所以在Windows下面的OpenGL程序可能会用MFC来做窗口,在Linux下可能就是X Window窗口了。所以OpenGL估计觉得要做就得做得全一点,一条龙服务嘛,就也弄了个窗口管理库GLUT。这个库是用来实现如产生窗口、消息循环等窗口系统功能的,而且是跨平台的,也就是写出来的程序在Windows下运行的样子与Linux下运行的窗口样子都一样。当然也可以不用GLUT窗口库,改用其他的窗口系统,那就需要有个接口可以使窗口系统与OpenGL进行交流,在Windows下是wgl打头的一类函数,在XWindow下是xgl打头的一类函数。其他的类似。

(4)GLEXT扩展库

想使用更高版本GL的特性,你必须包含该头文件,并将你的显卡驱动更新到最新版本。

glext库用于根据显卡厂商对某个extension的具体说明来定义一些宏并声明一些函数指针的类型,所以其是与显示硬件相关的。

下面的来自:http://www.cnblogs.com/madfrog/archive/2010/06/25/1765243.html

下面就是glext为我们做的事:
a.根据显卡厂商对某个extension的具体说明来定义一些宏.
#define GL_ARRAY_BUFFER_ARB 0x8892 //具体的地址是在各个specification中定义的.
#define GL_STATIC_DRAW_ARB 0x88E4
b. 声明一些函数指针的类型.
typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data, GLenum usage);
然后在我自己的实现中就需要做以下的事:
a.声明定义一些函数指针:
PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
b. 利用wglGetProcAddress函数取得各个函数的地址指针.
glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress("glBindBufferARB");
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffersARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress("glBufferDataARB");
而其实在glATI.h, wglATI.h, ATIExtensions.h, and ATIExtensions.c中也是这么做的.
而下面介绍的那些glew, glee就将上面4步都给我们做了.
所以当使用扩展功能的时候,要么是下载glext回来,自己提供源代码实现上面的两步,要么是直接用glew或者glee.

(5)GLEW库

转摘自:http://blog.csdn.net/a117653909/archive/2010/03/26/5418604.aspx

GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口。使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些OpenGL的高级特性,就必须下载最新的扩展,另外,不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数,你要想用这数涵数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识 别你的平台所支持的全部OpenGL高级扩展涵数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全 部函数。GLEW支持目前流行的各种操作系统(including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris)。

官方主页:http://glew.sourceforge.net/

(6)GLEE库