GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口。使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些OpenGL的高级特性,就必须下载最新的扩展,另外,不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数,你要想用这数涵数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识
别你的平台所支持的全部OpenGL高级扩展涵数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全 部函数。GLEW支持目前流行的各种操作系统(including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris)。

项目主页: http://glew.sourceforge.net/ 
文档地址: http://glew.sourceforge.net/install.html 
下载地址: https://sourceforge.net/project/downloading.php?group_id=67586&filename=glew-1.5.1-src.zip

================================================================================================================================================

在OpenGL编程中,使用glMultiTexCoord2f( GL_TEXTURE0+i, x, y ); 你会发现这个函数都没有定义的,以及GL_TEXTURE0,这个常量。因为在vc编译器中,OpenGL的版本是1.1,版本比较落后,下个 glew库就可以了。

安装的步骤,与glut一模一样,将dll动态链接库放在c:\WINDOWS:\system32;

头文件,可以搜索一下gl.h,或者gluax.h会发现在编译器(指vc)的安装路径下的,vc:\PlatformSDK:\include \gl文件夹中,将glew放在这里就ok了。

静态库lib文件的话,放在vc:\PlatformSDK:\Lib文件中。

如果在使用了glew,但是编译出:没有定义的XXX函数之类的错误,可以在文件开头加上: #pragma comment(lib, "glew32.lib")

还有一个问题:查看glew.h文件,会发现这么一段话:

#if defined(__gl_h_) || defined(__GL_H__)

#error gl.h included before glew.h

#endif

这句规定不能在glew之前引用gl.h文件。否则会报错:gl.h included before glew.h

下载地址: http://glew.sourceforge.net/

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jisdy/archive/2008/07/29/2730432.aspx

=====================================================================================================================

OpenGL Extension Wrangler Library(转)

http://glew.sourceforg.net

实在不知道Wrangler 应该在这里当什么意思讲,不过他已经被包含到OpenGL SDK了,官方是推荐使用它的。

GLEW有什么用?你可以把它看作是windows上的OpenGL的基本库,他取代了原来的gl.h wgl.h,让你可以方便的调用最新的OpenGL功能,包括OpenGL众多的Extension。

实际上我对这个OpenGL的体系也是稀里糊涂,除了核心的概念和功能,对扩展功能基本上是抓瞎的。这就是为什么我要读GLEW的源码。读源码似乎很傻,不过总比等别人出书要聪明的多。

开始吧。

基本特性:

  • 跨操作系统
  • 支持动态链接、静态库,你还可以把glew.c复制到工程中一起编译
  • 只依赖于OPENGL32.dll和KERNEL32.dll
  • 因为不依赖于CRT所有你使用single-threaded, multi-threaded 或者 multi-threaded DLL都没有限制

文件结构:

发布版本包括一个glew32.dll和对应的glew32.lib,头文件glew.h和wglew.h。(windows dll版本)。源文件只有一个glew.c。

glew基本使用:

初始化

#include <GL/glew.h>放在一切和gl有关的头文件之前,就完成了引用

GLenum err = glewInit(); 如果err为真就完成了初始化,应该放在程序的开始部分。现在还是不明白为什么有操作可以早于初始化执行。

检查扩展

if (GLEW_ARB_vertex_program)

{

/* 通过了ARB_vertex_program extension 的检查. */

glGenProgramsARB(...);

}

if (GLEW_VERSION_1_3)

{

/* OpenGL 1.3 是被支持的 */

}

if (glewIsSupported("GL_VERSION_1_4 GL_ARB_point_sprite"))

{

/* 两个都通过了检查 */

}

if (glewGetExtension("GL_ARB_fragment_program"))

{

/* 检查ARB_fragment_program 是被支持的. */

}

GLEW为了实现扩展检查的功能,编制了大量的代码。简单的看就是即支持宏标签又支持字符串查询。

glew.h源码结构:

开头就检测有没有和GLEW冲突的库

#if defined(__gl_h_) || defined(__GL_H__)

#error gl.h included before glew.h

#endif

#if defined(__glext_h_) || defined(__GLEXT_H_)

#error glext.h included before glew.h

#endif

#if defined(__gl_ATI_h_)

#error glATI.h included before glew.h

#endif

这些文件功能上和GLEW是重复的,所有开始就屏蔽掉了。

接下来的一堆宏只是为了正确的定义 GLEWAPI GLAPI GLAPIENTRY CALLBACK 等等宏。这些定义本来已经在其他的头文件中定义了,比如WINGDIAPI就在winnt.h中定义过了。这里画蛇添足的做法只是为了保证GLEW的纯洁性,为了不依赖任何不必要的库和头文件。

再下面就是OpenGL1.1的定义了。这里很简单就是类型定义和宏定义,API使用外部函数方式,这就是为什么不需要gl.h了。

#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1)

唯一让人有点不解的是这句,解析了所有的宏之后GLEW_VERSION_1_1被定义为一个GLboolean类型的变量。之后就让人很烦了 __GLEW_VERSION_1_1被初始化为GL_FALSE,然后作者又在检测到支持1.1之后把GLEW_VERSION_1_1赋值为真。宏来宏去的让人郁闷。不过想想也是有道理的,GLEW_VERSION_1_1作为检测标志必须是个宏,而宏是不能修改值的,既然他可能为真也可能为假,那就只有一个办法,找一个变量作为他的存储空间,然后这个宏就可以当变量使用了。

再下面#include <GL/glu.h>

再下面是OpenGL1.2的定义,和1.1的定义方式类似,只是函数定义方式不同了。

typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);

typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);

typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);

#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)

#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)

#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D)

#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D)

4个函数指针定义对应4个define,看名字就知道他们是一一对应的,但是就是对不上,郁闷吧。但是在文件最后的部分能找到这样的代码。

GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;

GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;

GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D;

GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D;

也是4个,这下对上号了吧。PFNGLCOPYTEXSUBIMAGE3DPROC 是一个函数指针类型定义 __glewCopyTexSubImage3D是实际被定义的指针函数,#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D)又指向了glCopyTexSubImage3D 。到最后 glCopyTexSubImage3D 才是真正的API接口。真费劲。

再往下1.3 1.4 1.5 2.0 2.1 3.0结构完全和1.2一致

再往下就是各种扩展了,形式上还是和1.2定义的方式一致

再往下就是GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D;等等了。

再往下是GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;等等。

最后才是GLEW的主要函数接口。这里支持一个GLEW_MX的定义,就是对GLEW MX的支持。

glew.c源码结构:

相对简单的多,除了一些函数的实现以外,全是初始化函数。

全部都是从glewInit开始的,一路下去初始化各个版本和所有扩展。

wglew

看明白上面的,这里就不用说了,比葫芦看瓢吧

本文直接转自:http://www.cnblogs.com/madfrog/archive/2010/06/25/1765259.html

【OpenGL开发】关于GLEW扩展库的更多相关文章

  1. GLEW扩展库【转】

    http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html 一.关于GLEW扩展库: GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用O ...

  2. 【游戏开发】基于VS2017的OpenGL开发环境搭建

    一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...

  3. 【C/C++开发】c++ 工具库 (zz)

    下面是收集的一些开发工具包,主要是C/C++方面的,涉及图形.图像.游戏.人工智能等各个方面,感觉是一个比较全的资源.供参考!  原文的出处:http://www.codemonsters.de/ho ...

  4. ubuntu 下编译glew (opengl扩展库)

    最近在研究咋样在QT 下使用opengl 扩展库glew.首先需要明白的是QT中对glut等库进行了封装,但是对glew和glfw等库需要自己编译后使用. 安装步骤: 1.下载Ubuntu下的glew ...

  5. OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW

    Step1:Visual Studio 2017 Why 开发环境,后面编译GLFW 和 GLEW也要用 How 这里使用的是Visual Studio 2017的 Community 版本,直接官网 ...

  6. 计算机图形学——OpenGL开发库开发库

    vc++6.0 有 OpenGL 的东西.有头文件 GL.H, GLAUX.H, GLU.H 但没有 GLUT 软件包/工具包 如果想使用glut.h的话必须自己添加. 首先下载 OpenGL开发库, ...

  7. CentOS6.2 下安装OpenGL开发库

    在Linux下做Qt开发,结果运行程序的时候提示找不到GL/gl.h文件,所以只能先把OpenGL库安装上去,不知道这样操作对不对,以后再考虑吧,下面开始安装 1.查看mesa相关的包 yum lis ...

  8. OpenGL学习进程(2)OpenGL开发环境的搭建

        通过本节,我们来学习一下在Win10 64.VS1013环境下搭建OpenGL的开发环境.     (1)选择一个编译环境: 现在在windows中OpenGL的主流编译工具有Visual S ...

  9. [Modern OpenGL系列(一)]十步搞定OpenGL开发环境

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51292143 OpenGL官网:https://www.opengl.or ...

随机推荐

  1. windbg调试托管代码 .Net clr

    现在很多的程序都是多语言混合编程的,比如我司的产品,就是用C++/.net clr混合编制的.那么当我们调试这样的程序时,一定要注意,比如有时我们只看到c++的栈和名称,而.net clr的代码确看不 ...

  2. QMutexLocker基于QMutex的便利类

    首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义   私有成员变量  和  全局变量,只能够定义局部变量来使用. 使用方法:(1)先定义一个QMutex类的 ...

  3. cube.js 学习(八)backend部署模式

    cube.js 从设计上就进行了系统上的分层,backend,frontend,backend 是cube.js 的核心 对于cube.js backend 的部署官方也提供了好多中方法 部署模型 s ...

  4. sqlite3 入门

    SQLite3 C语言API入门下载SQLite3 我们下载sqlite源码包,只需要其中的sqlite3.c.sqlite.h即可.最简单的一个创建表操作#include <stdio.h&g ...

  5. 服务器上build.xml文件乱码解决(亲测有效)

    前提条件:必须root账户登录系统,否则无权限 1. 修改/etc/sysconfig/i18n: 拷贝如下内容到文件中 #LANG="zh_CN.UTF-8" LANG=&quo ...

  6. python 中 list 去重复

    方法1 list=[,,,] set=set(list) list2=list(set) 方法2 list=[,,,] list2=[] for i in list: if i not in list ...

  7. TCP采用四次挥手关闭连接如图所示为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭. 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个 ...

  8. 数据库已经最优,每次操作50万条数据,怎么提高API接口的速度?

    第一种可以使用负载均衡,10台,就每台5W条数据第二种每台机器.可以把添加任务队列.利用多线程解决IO密集型任务的特点.第三种利用异步协程方式提高调度行为

  9. 无旋Treap模板

    传送门 Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) # ...

  10. 【洛谷】P3177 [HAOI2015]树上染色

    懒得复制题面了直接传送门吧 分析 直接求点与点之间的距离感觉不是很好求,所以我们考虑换一个求法. 瞄了一眼题解 距离跟路径上边的长度有关,所以我们直接来看每一条边的贡献吧(这谁想得到啊) 对于每一条边 ...