现在的位置: 首页 > 综合 > 正文

OpenGL版本与OpenGL扩展机制

2013年08月23日 ⁄ 综合 ⁄ 共 4051字 ⁄ 字号 评论关闭

OpenGL版本比较

 

 

1 opengl的版本区别(在opengl官方文档中有详细说明)

    针对Opengl不同版本的升级是主要是扩展指令集。

       1.1 opengl1.1

1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。

 

 

1.2 opengl1.3

20018月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。

 

 

1.3 opengl1.4

20027月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。

 

 

1.3 opengl1.5

2003年的7月,ARB公布OpenGL 1.5规范。OpenGL 1.5内包含ARB制定的正式扩展规格绘制语言OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代OpenGL 2.0版本的内核。OpenGL 1.5的变化还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询功能等等。其主要内容包括

l         顶点Buffer Object:进行顶点配列方式可以提高透视性能

l         Shadow功能:增加用来比较Shadow映射的函数

l         隐蔽查询(QUERY):为提高Curling性能采用非同步隐蔽测试

l         非乘方纹理(Texture):提高mipmap等纹理内存的使用效率

l         OpenGL Shading Language v.1.0:用于着色(shader)对象、顶点着色以及片断着色技术(fragment shader )的扩展功能

 

 

1.4  opengl2.0

OpenGL 1.0推出后的相当长的一段时间里,OpenGL唯一做的只是增加了一些扩展指令集,这些扩展指令是一些绘图功能,像是ClearCoatMultisample、视频及绘图的整合工具(某些是通过OpenML的努力而开发出来的,它本身属于OpenGL ARB扩展指令之一。

去年8月已经推出opengl2.0OpenGL 2.0将在OpenGL 1.3基础上进行修改扩充、但它将有下面五个方面的重大改进:复杂的核心被彻底精简;完全的硬件可编程能力;改进的内存管理机制、支持高级像素处理;扩展至数字媒体领域,使之跨越高端图形和多媒体范畴;支持嵌入式图形应用。

 为了在获得强大功能的同时保持理想的兼容性,OpenGL 2.0经历以下两个发展阶段:第一个阶段注重兼容能力和平滑过渡,为此,OpenGL 2.0核心将在精简后的OpenGL 1.3功能模块的基础上加上可完全兼容的新功能共同组成,这种做法在满足兼容性的同时,还可将原有OpenGL中数量众多、且相互纠缠不清的扩展指令进行彻底精简。   第一阶段的任务只是为了过渡,而第二阶段才是OpenGL 2.0的真正成熟期。此时,ARB将合成出一个OpenGL 2.0”内核,纯内核将包含更多新增加的精简型API函数,这些函数具有完全的可编程特性、结构简单高效、功能强大且应用灵活。除了完成这项任务外,ARB组织还得指导开发商抛弃繁琐的OpenGL 1.X、转用更具弹性的OpenGL 2.0”

 

 

 

 

2 OpenGL扩展(OpenGL Extensions

    OpenGLDirect3D比较起来,最大的一个长处就是其扩展机制。硬件厂商开发出一个新功能,可以针对新功能开发OpenGL扩展,软件开发人员通过这个扩展就可以使用新的硬件功能。所以虽然显卡的发展速度比OpenGL版本更新速度快得多,但程序员仍然可以通过OpenGL使用最新的硬件功能。而Direct3D则没有扩展机制,硬件的新功能要等到微软发布新版DirectX后才可能支持。

    OpenGL扩展也不是没有缺点,正因为各个硬件厂商都可以开发自己的扩展,所以扩展的数目比较大,而且有点混乱,有些扩展实现的相同的功能,可因为是不同厂商开发的,接口却不一样,所以程序中为了实现这个功能,往往要为不同的显卡写不同的程序。这个问题在OpenGL 2.0出来后可能会得到解决,OpenGL 2.0的一个目标就是统一扩展,减少扩展数目。

 

2.1 扩展名

每个扩展都有一个扩展名,扩展名类似如下形式:

                       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就是多重纹理扩展。

 

2.2使用OpenGL扩展

 要使用一个OpenGL扩展,首先必须检查显卡是否支持这个扩展,以下代码可以获取一个显卡支持的的OpenGL扩展:
      const char *str = glGetString( GL_EXTENSIONS );
 
函数返回一个字符串指针,这个字符串就是显卡所支持的所有扩展的扩展名,不同的扩展名之间用空格隔开,形如:

 

 

   "GL_ARB_imaging GL_ARB_multitexture GL_ARB_point_parameters ……"

    

    OpenGL扩展往往都会新增一些函数,在Windows平台上,这些函数不是通过.lib库连接到程序里的,而要在运行时动态获得函数的指针。我们以GL_ARB_point_parameters扩展为例看看怎么获得函数指针。

  

首先要定义函数指针类型,

typedef void (APIENTRY * PFNGLPOINTPARAMETERFARBPROC)(GLenum pname,
     GLfloat param);
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname,
     const GLfloat *params);

这个工作SGI已经为我们做好,它提供了一个头文件 glext.h ,里面有目前绝大多数扩展的常量和函数指针定义,下载下来放到编译器的include/GL文件夹下面,然后在程序里面加上:

  #include <GL/glext.h>

就可以在程序中使用常量和函数指针类型了。

  

然后要定义函数指针:

   PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB;
      PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB;

  
再检查显卡是否支持GL_ARB_point_parameters扩展,其中isExtensionSupported是自定义的一个函数,就是在glGetString( GL_EXTENSIONS )返回的字符串里查找是否存在指定的扩展名:

  int hasPointParams = isExtensionSupported("GL_ARB_point_parameters");

  

如果支持,就可以用wglGetProcAddress函数获取扩展函数的指针:
  if (hasPointParams) 

  {
    glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC
/
       wglGetProcAddress( "glPointParameterfEXT" );
    glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) /
      wglGetProcAddress( "glPointParameterfvEXT" );
  }
  
最后就可以在程序里使用扩展函数:

  if (hasPointParams)

  {
    static GLfloat quadratic[3] = { 0.25, 0.0, 1/60.0 };
    glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, quadratic);
    glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
  }

 

另外,下面代码说明如何访问扩展函数:(资料来源于csdn知识库

调用wglGetProcAddress函数访问一个不在标准OpenGL库中的扩展函数。如果该扩展函数存在当前的执行(implementation)中,那么wglGetProcAddress返回一个用来访问该函数的函数指针。否则,wglGetProcAddress返回NULL.

例如,要访问glAddSwapHintRectWIN扩展函数,如下调用wglGetProcAddress:

抱歉!评论已关闭.