Opengl烦人的扩展

 
      GPU 加速的体渲染写差不多了,拿到其它机器测试,发现我程序兼容性好差。OPENGL的扩展啊,真麻烦。我那台geforce 8800的电脑用的是opengl 2.1,着色器的加载那些函数已成为核心规范一部分,用起来自然方便。另一台6600的显卡,只能用扩展了。
OpenGL 扩展OpenGL Extensions
Opengl 的扩展本来是opengl的一大优点,开发人员可通过opengl扩展立即使用到硬件供应商在他们产品中加入的一些新特性。而 Direct3D 则没有扩展机制,硬件的新功能要等到微软发布新版 DirectX 后才可能支持。然而,各个硬件厂商都可以开发自己的扩展,所以扩展的数目比较大,而且有点混乱。当然很多扩展最终都会成为Opengl核心规范的一部分,但不能之外所以客户都,支持相同的OPENGL版本和扩展,因此需要编写版本和扩展安全代码。
Windows下的扩展

        如果要在任何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哪部分开发的扩展,有以下几个值:  

 

·    GL  针对OpenGL核心的扩展
·         WGL 针对Windows平台的扩展
·         GLX 针对Unix / Linux平台的扩展
·         GLU 针对OpenGL Utility Library的扩展
第二段ARB,用来表示是谁开发的这个扩展,常见以下几个值:
·         ARB OpenGL Architecture Review BoardOpenGL管理机构)正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂商开发的扩展和ARB扩展,应该优先使用ARB扩展 
·         EXT 被多个硬件厂商支持的扩展
·         NV  – nVIDIA 公司开发的扩展
·         ATI – ATI公司开发的扩展
·         ATIX– ATI公司开发的实验性扩展
·         SGI – Silicon GraphicsSGI)公司开发的扩展
·    SGIX– Silicon GraphicsSGI)公司开发的实验性扩展
multitexture就是真正的扩展名了,如multitexture就是多重纹理扩展。

 

使用扩展

     分为三个步骤1、确定该扩展是否被支持2、确定将使用到这个扩展中的哪些函数,并设法得到这些函数的入口点 3、定义将要使用的标识。

 

  1. bool IsExtensionSupported( char* szTargetExtension )
  2. {
  3.  const unsigned char *pszExtensions = NULL;
  4.  const unsigned char *pszStart;
  5.  unsigned char *pszWhere, *pszTerminator; 
  6. // Extension names should not have spaces
  7.  pszWhere = (unsigned char *) strchr( szTargetExtension, ' ' );
  8.  if( pszWhere || *szTargetExtension == '/0' )
  9.   return false;
  10.  // Get Extensions String
  11.  pszExtensions = glGetString( GL_EXTENSIONS );
  12.  // Search The Extensions String For An Exact Copy
  13.  pszStart = pszExtensions;
  14.  for(;;)
  15.  {
  16.   pszWhere = (unsigned char *) strstr( (const char *) pszStart, szTargetExtension );
  17.   if( !pszWhere )
  18.    break;
  19.   pszTerminator = pszWhere + strlen( szTargetExtension );
  20.   if( pszWhere == pszStart || *( pszWhere - 1 ) == ' ' )
  21.    if( *pszTerminator == ' ' || *pszTerminator == '/0' )
  22.     return true;
  23.   pszStart = pszTerminator;
  24.  }
  25.  return false;
  26. }
判断顶点缓冲对象是否被支持,可以g_fVBOSupported = IsExtensionSupported( "GL_ARB_vertex_buffer_object" );

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值