opengl: Opengl的扩展

来源:互联网 发布:c语言关系运算符优先级 编辑:程序博客网 时间:2024/05/05 15:33

一: 概述:

        OpenGL和Direct3D比较起来,最大的一个长处就是其扩展机制。硬件厂商开发出一个新功能,可以针对新功能开发OpenGL扩展,软件开发人员通过这个扩展就可以使用新的硬件功能。所以虽然显卡的发展速度比OpenGL版本更新速度快得多,但程序员仍然可以通过OpenGL使用最新的硬件功能。而Direct3D则没有扩展机制,硬件的新功能要等到微软发布新版DirectX后才可能支持。 OpenGL扩展也不是没有缺点,正因为各个硬件厂商都可以开发自己的扩展,所以扩展的数目比较大,而且有点混乱,有些扩展实现的相同的功能,可因为是不同厂商开发的,接口却不一样,所以程序中为了实现这个功能,往往要为不同的显卡写不同的程序。这个问题在OpenGL 2.0出来后可能会得到解决,OpenGL 2.0的一个目标就是统一扩展,减少扩展数目。


二: 扩展格式解析:

        每个扩展都有一个扩展名,扩展名类似如下形式: GL_ARB_multitexture。 
        1. 第一段GL,用来表示针对OpenGL哪部分开发的扩展,有以下几个值: 
                   GL – 针对OpenGL核心的扩展 
                   WGL – 针对Windows平台的扩展 
                   GLX – 针对Unix / Linux平台的扩展 
                   GLU – 针对OpenGL Utility Library的扩展 


         2. 第二段ARB,用来表示是谁开发的这个扩展,常见以下几个值:
                   ARB – 经OpenGL Architecture Review Board(OpenGL管理机构)正式核准的扩展,往往由厂商开发的扩展发展而来,如果同时存在厂                                 商开发的扩展和ARB扩展,应该优先使用ARB扩展 
                   EXT – 被多个硬件厂商支持的扩展 
                   NV – nVIDIA 公司开发的扩展 
                   ATI – ATI公司开发的扩展 
                   ATIX– ATI公司开发的实验性扩展 
                   SGI – Silicon Graphics(SGI)公司开发的扩展 
                   SGIX– Silicon Graphics(SGI)公司开发的实验性扩展 


           3. 第三段 multitexture 就是真正的扩展名了,如multitexture就是多重纹理扩展。

三: windows上使用OpenGL扩展: 

        1: 查看显卡支持的扩展: 

              针对Windows平台使用WGL扩展,WGL扩展串要通过WGL_ARB_extensions_string扩展来获得,以下代码演示了如何获得WGL扩展串:
              定义WGL_ARB_extensions_string扩展新增函数wglGetExtensionsStringARB的函数指针类型,同样这个工作SGI已经为我们做好,只不过不                 在glext.h中,而在它提供的另外一个头文件 wglext.h 中:
                    typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
              定义函数指针:
                    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;
              检查是否支持WGL_ARB_extensions_string扩展,如果不支持,表示这个显卡不支持WGL扩展,如果支持用wglGetExtensionsStringARB函                数的指针,并调用它得到WGL扩展串:
                    int hasWGLext = isExtensionSupported("WGL_ARB_extensions_string");
                    if (hasWGLext)
                    {
                          wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) \
                          wglGetProcAddress( "wglGetExtensionsStringARB" );
                          const char *wglExt = wglGetExtensionsStringARB( hdc );
                    }


         2: 获取函数指针,使用glext

               2.1: 头文件的包含

                           #include <iostream>

                           #include <windows.h>

                           #include <GL/glut.h>

                           #include <GL/glext.h>

              2.2: 获取函数指针

                     PFNGLBLENDEQUATIONPROC  glBlendEquation = NULL;

                     glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");

                     glBlendEquation(GL_FUNC_ADD) ;

         3: 获取函数指针,使用glew

                     #include <GL/glew.h>

                     #include <GL/glut.h>

                    不用获取地址指针,直接用  glBlendEquation(GL_FUNC_ADD) 


四: linux上使用Opengl的扩展

                  #include <GL/glx.h>

                 例如  定义  PFNGLBLENDEQUATIONPROC  原型

                 glBlendEquation = (PFNGLBLENDEQUATIONPROC)glXGetProcAddressARB("glBlendEquation");

                 glBlendEquation(GL_FUNC_ADD) ;

                 经过上面步骤取得扩展指针。

                或者使用 glew 

               

五: glext, glew 区别:

        其实两者没啥联系,只不过都提供Opengl扩展函数定义,通过他们能获取opengl的扩展。 glext是SGI发布的,定义opengl相关扩展函数定义,如果取得扩展函数指针,还需要wgl, glx 这些实际扩展库的支持。  而glew直接把上面的事都干了, 拿过glew可以直接使用扩展。 除了glext,glew之外也有好多获得扩展的实现, 其实思路无非就是查询扩展是否被当前显卡支持,然后定义扩展函数,然后利用本地平台库获取扩展函数指针。 

      



0 0
原创粉丝点击