OpenGL入门系列- OpenGL的扩展

一: 概述:

        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之外也有好多获得扩展的实现, 其实思路无非就是查询扩展是否被当前显卡支持,然后定义扩展函数,然后利用本地平台库获取扩展函数指针。 

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑不溜秋的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值