当前位置: 首页 > news >正文

GLEW扩展库【转】

http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html

 

一、关于GLEW扩展库:

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为GLEW_OK(实际上返回0,其宏定义中GLEW_OK为0)就完成了初始化,应该放在程序的开始部分。现在还是不明白为什么有操作可以早于初始化执行。

检查扩展

if (GLEW_ARB_vertex_program)
{

glGenProgramsARB(...);
}

if (GLEW_VERSION_1_3)
{

}

if (glewIsSupported("GL_VERSION_1_4 GL_ARB_point_sprite"))
{

}

if (glewGetExtension("GL_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

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

 

二、生产并添加静态库:

vs2008  生成静态链接库lib
 
1. 静态链接库的创建
 
   在solution中 new project ->win32 project -> static library 即可创建生成静态链接库的项目。 在该项目的properties中可看到:
 
Configuration Properties -->General --> Configuration type 中可以看到是lib
Configuration Properties --> General --> Output Directory 是生成lib的目录
Library -->General -->Output File 是生成的文件名字
 
将GLEW链接为静态库,在你的project preprocessor settings中,需要定义GLEW_STATIC 。否则,GLEW会认为使用的是DLL版本。
 
2. 添加静态链接库
 
包含头文件
引入lib文件

参见:http://technet.microsoft.com/zh-cn/library/ms235627.aspx

To use the functionality from the static library in the application
1). After you create a console application, the wizard creates an empty program for you. The name for the source file will be the same as the name that you chose for the project earlier. In this example, it is named MyExecRefsLib.cpp.
2).You must reference the static library you created to use its math routines. To do this, select References from the Projectmenu. From the MyExecRefsLib Property Pages dialog box, expand the Common Properties node and then click Add New Reference. For more information about the References dialog box, see Framework and References, Common Properties, <Projectname> Property Pages Dialog Box.
3). The Add Reference dialog box is displayed. The Projects tab lists the projects in the current solution and any libraries that you can reference. On the Projects tab, select MathFuncsLib.Click OK.
4).To reference the MathFuncsLib.h header file, you must modify the include directories path. In the MyExecRefsLib Property Pages dialog box, expand the Configuration Properties node, expand the C/C++ node, and then select General. In theAdditional Include Directories property value, type the path of the MathFuncsLib directory or browse for it.
5). To browse for the directory path, in the property value drop-down list box, click Edit. In the Additional Include Directoriesdialog box, in the text box, select a blank line and then click the ellipsis button (…) at the end of the line. In the Select Directory dialog box, select the MathFuncsLib directory and then click Select Folder to save your selection and close the dialog box. In the Additional Include Directories dialog box, click OK.
6).You can now use the MyMathFuncs class in this application. To do this, replace the contents of MyExecRefsLib.cpp with the following code.

调用lib库提供的函数
    注意,debug 和 release 模式下生的的lib文件是不一样的,在其他项目引用生成的lib文件时,处于debug模式下必须引用debug模式下生成的lib文件,release模式下必须引用release模式下生成的文件。否则可能会出问题。

相关文章:

  • JDBC 调用存储过程
  • java web项目修改favicon.ico图标的方式
  • 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
  • $$$$GB2312-80区位编码表$$$$
  • CFD使用者应当了解的一些事情
  • C# 进程同步,通信
  • 第三份CS地图--沙漠之战
  • 构建基于分布式SOA架构的统一身份认证体系
  • 傻瓜式Linux之三:安装软件
  • Python 3.5 socket OSError: [Errno 101] Network is unreachable
  • 华章1-2月份新书简介(2017年)
  • 专业网站打包/解包asp工具(E文精装版本)!
  • 【健康医疗】4步完成数据分析报表,让医疗数据转化为生产力
  • ORACLE查找并解除死锁进程
  • 云计算那些事
  • 收藏网友的 源程序下载网
  • [笔记] php常见简单功能及函数
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java 内存分配及垃圾回收机制初探
  • js继承的实现方法
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Redis的resp协议
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Selenium实战教程系列(二)---元素定位
  • spring security oauth2 password授权模式
  • SwizzleMethod 黑魔法
  • Vue UI框架库开发介绍
  • 订阅Forge Viewer所有的事件
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端性能优化--懒加载和预加载
  • 什么软件可以剪辑音乐?
  • 小而合理的前端理论:rscss和rsjs
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #每日一题合集#牛客JZ23-JZ33
  • $jQuery 重写Alert样式方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第二周)效能测试
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (蓝桥杯每日一题)love
  • (学习日记)2024.01.09
  • (正则)提取页面里的img标签
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***原理与防范
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core 中插件式开发实现
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net 受管制代码