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