《高效学习OpenGL》之 如何使用OpenGL扩展

一. 如何判断是否是显卡所支持的扩展:

使用函数glGetString,看一下它的原型:

const     GLubyte   * glGetString( GLenum name )

      我们以GL_EXTENSIONS为参数调用该函数,就能获得当前显卡所支持的所有扩展,像下面这样:

const GLubyte *str = glGetString(GL_EXTENSIONS) ;

cout << str << endl ;

      输出的各个扩展之间以空格分隔,如果这些扩展中包含GL_ARB_imaging,那么你就可以使用glBlendEquation这个函数了。

      当然,这样查询的只是gl扩展,还可以用gluGetString获得glu扩展。

二. 使用扩展函数

      使用glext

1.GL扩展

      这里下载:(http://graphics.ethz.ch/pointshop3d/sourcedoc/html/glext_8h-source.html)

a)头文件的包含 这个文件并不是Windows系统中原有的,需要到网上下载。使用的时候有一点要注意,如果程序中还用到了glut.h文件,那么一定要把glext.h放在glut.h的后面,因为glext.h要用到gl.h,而glut.h中包含了gl.h,如果顺序搞错了,编译的时候会有一大堆错误,正确的顺序如下:

#include <iostream>

#include <windows.h>

#include <GL/glut.h>

#include <GL/glext.h>

b)获取函数指针

先定义函数指针,PFNGLBLENDEQUATIONPROC  glBlendEquation = NULL;

再获取函数地址使用wglGetProcAddress函数,注意这一句要加在使用glBlendEquation函数的语句之前才有效,最后后面紧跟着使用glBlendEquation的函数语句,切记不要加在所有子程序的外面,否则获取的指针是无效的

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

wglGetProcAddress //获取扩展函数的指针

例如可以这样加:

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

         switch(key)

         {

                   

         case ‘a‘:

         case ‘A‘:

                   //Note: glBlendEquation is a subset of GL_ARB_imaging, please call glGetString

                   //first to confirm whether your video card support this extension.

                   glBlendEquation(GL_FUNC_ADD) ;

                   break ;

         case ‘s‘:

         case ‘S‘:

                   glBlendEquation(GL_FUNC_SUBTRACT) ;

                   break ;

2.  使用glew

       glew也是一个扩展库,包含了OpenGL中许多核心及扩展函数,现在的版本是1.3.5,支持OpenGL2.1,可以到这里下载:

http://glew.sourceforge.net/

上面的方法可能有些麻烦,如果已经下载了glew库的话,那么可以直接使用该扩展,但是使用之前首先要确定你的显卡是否支持该扩展。方法如下:首先还是要判断显卡是否支持该扩展,我们这里假定已经支持,

1.包含头文件glew.h,注意这里和上面不同,这回glut.h要放在glew.h的后面了

像下面这样

#include <GL/glew.h>

#include <GL/glut.h>

然后就可以在程序中直接使用glBlendEquation了,其他扩展的判断和使用方法与此类似。

最后还有一点切记!那就是还要调用glewInit() ;来初始化一下方可使用扩展,如下:

GLenum err = glewInit() ;

         if (GLEW_OK != err)

         {

                   MessageBoxA(NULL, "error", "My Window", 1) ;

         }



《高效学习OpenGL》之 如何使用OpenGL扩展

上一篇:oozie自带示例的运行


下一篇:POJ 2485 Highways