如果要在任何Windows平台下使用opengl,那么扩展是绝对必需的。因为微软为了维护D3D,对OpenGL的支持很消极,其OpenGL实现仍然是1.1。由于Windows上的OpenGL程序最终都会动态链接到微软的OpenGL32.dll,可OpenGL32.dll只支持OpenGL 1.1,要使用新的功能,必需使用扩展。那么windows是怎样使用这些扩展的呢?OpenGL32.dll是微软的OpenGL 1.1纯软件实现,我们的程序都要动态链接到这个dll。如果安装3D芯片厂商的驱动程序,会将一个不同名字的dll放到Windows系统目录下,比如在Windows XP下安装nVIDIA 的驱动程序,会在系统目录SYSTEM32下放一个nvoglnt.dll(这就是nVIDIA的OpenGL驱动),并在注册表中登记nvoglnt.dll,让Windows知道硬件加速OpenGL驱动的名字,以后运行OpenGL程序,OpenGL32.dll就会把OpenGL调用直接转到nvoglnt.dll。
扩展名
每个扩展都有一个扩展名,扩展名类似如下形式: GL_ARB_multitexture
第一段GL,用来表示针对OpenGL哪部分开发的扩展,有以下几个值:
使用扩展
分为三个步骤1、确定该扩展是否被支持2、确定将使用到这个扩展中的哪些函数,并设法得到这些函数的入口点 3、定义将要使用的标识。
- bool IsExtensionSupported( char* szTargetExtension )
- {
- const unsigned char *pszExtensions = NULL;
- const unsigned char *pszStart;
- unsigned char *pszWhere, *pszTerminator;
- // Extension names should not have spaces
- pszWhere = (unsigned char *) strchr( szTargetExtension, ' ' );
- if( pszWhere || *szTargetExtension == '/0' )
- return false;
- // Get Extensions String
- pszExtensions = glGetString( GL_EXTENSIONS );
- // Search The Extensions String For An Exact Copy
- pszStart = pszExtensions;
- for(;;)
- {
- pszWhere = (unsigned char *) strstr( (const char *) pszStart, szTargetExtension );
- if( !pszWhere )
- break;
- pszTerminator = pszWhere + strlen( szTargetExtension );
- if( pszWhere == pszStart || *( pszWhere - 1 ) == ' ' )
- if( *pszTerminator == ' ' || *pszTerminator == '/0' )
- return true;
- pszStart = pszTerminator;
- }
- return false;
- }
2获取功能函数的入口点
在编译程序的时候,扩展函数不能使用,必须在运行时动态地链接它们。当然这也不是什么难事,要做的只是获得一个函数指针而已。
首先在程序中声明一个函数指针 如
GLuint (APIENTRY *glCreateProgram_ptr)(void)=NULL
接下来为这个函数分配一个函数入口点,方法取决于你使用的平台。对Windows来说,用wglGetProcAddress这个函数。
glCreateProgram=( GLuint (APIENTRY *glCreateProgram_ptr)(void)) wglGetProcAddress("glCreateProgram");
这样的函数指针声明非常难看,用typedef会让我们的代码舒服很多。如果使用glext.h或者一下第三方的扩展库,如glew或者glee等,所有需要的标识符都已经被定义好了。推荐glew,包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。Glew跟普通的动态库一样使用,如果开发环境是VC,glew.h放到/VC98/Include/GL里,glew32.lib放在LIB文件夹下,glew32.dll放到系统目录。然后#pragma comment(lib,”glew32.lib”)连接,或者在project->settings->link->object/library modules下添加glew32.lib。