GLEW扩展库【转】
http://blog.sina.com.cn/s/blog_4aff14d50100ydsy.html
一、关于GLEW扩展库:
项目主页: 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(转)
实在不知道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
看明白上面的,这里就不用说了,比葫芦看瓢吧.
二、生产并添加静态库:
生成静态链接库lib
静态链接库的创建
在solution中 new project ->win32
project -> static library 即可创建生成静态链接库的项目。
在该项目的properties中可看到:
Properties -->General -->
Configuration type 中可以看到是lib
Properties --> General --> Output
Directory 是生成lib的目录
-->General -->Output File
是生成的文件名字
。否则,GLEW会认为使用的是DLL版本。
添加静态链接库
参见:http://technet.microsoft.com/zh-cn/library/ms235627.aspx
application
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.
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.
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.
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.
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.
this application. To do this, replace the contents of
MyExecRefsLib.cpp with the following code.
和 release
模式下生的的lib文件是不一样的,在其他项目引用生成的lib文件时,处于debug模式下必须引用debug模式下生成的lib文件,release模式下必须引用release模式下生成的文件。否则可能会出问题。
GLEW扩展库【转】的更多相关文章
- 【OpenGL开发】关于GLEW扩展库
GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些Open ...
- ubuntu 下编译glew (opengl扩展库)
最近在研究咋样在QT 下使用opengl 扩展库glew.首先需要明白的是QT中对glut等库进行了封装,但是对glew和glfw等库需要自己编译后使用. 安装步骤: 1.下载Ubuntu下的glew ...
- Z.ExtensionMethods 一个强大的开源扩展库
今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去看了一下,也都只是提到而已,没有专门介绍,才引起我写这篇文档 ...
- PHP使用mysqli扩展库实现增删改查(面向对象版)
mysqli扩展库是mysql扩展库的改进版本,在mysql扩展库的基础上提高了稳定性和效率,mysqli扩展库有两套东西,一套就是面向过程的mysqli另一套是面向对象的mysqli.操作方式大体和 ...
- PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)
1.和mysql扩展库的区别: (1 安全性.稳定性更高 (2 提供了面向对象和面向过程两种风格 2.php.ini 中的 extension=php_mysqli.dll 解除封印 3.面 ...
- PHP基础Mysql扩展库
mysql扩展库操作步骤如下: 1.连接数据库 2.选择数据库 3.设置操作编码 4.发送指令sql,并返回结果集 ddl:数据定义语句 dml:数据操作语句 dql:数据查询 ...
- mysql扩展库-1
启用mysql扩展库 在php.ini文件中去配置mysql扩展库 extension=php_mysql.dll 可以通过 phpinfo() 查看当前php支持什么扩展库. 在sql扩展库中创建一 ...
- 安装php扩展库
无法加载'pdo_mysql' ,因为需要pdo这个module.PHP Warning: Cannot load module 'pdo_mysql' because required module ...
- EF扩展库(批量操作)
EF删除和修改数据只能先从数据库取出,然后再进行删除 delete from Table1 where Id>5; update Table1 set Age=10; 我们需要这样操作 //删除 ...
随机推荐
- [FZU2261]浪里个浪
TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划. 现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道.他已经预先 ...
- POJ2680(动态规划,大数)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4548 Accepted ...
- linux下检测可用串口并使用minicom打开
目前使用minicom作为串口软件.但使用过程中,有一点感觉不方便的地方,就是我需要使用多个串口,当使用的不是串口0时,就要手动修改minicom的配置. 于是考虑实现脚本,自动列出当前串口,选择后调 ...
- win 7 浏览器被篡改小插曲
今天下班回家,打开台式机发现IE,火狐都被篡改了.作为运维都会有点强迫症.这是个桌面系统,实在是没兴趣捣鼓.但是还是没办法,经常要用.等我下次有空了,直接换linux好了. 于是开始排查问题吧: 1. ...
- niceScroll在ie11和edge浏览器上面滚动时抖动问题
niceScroll 是一个很好的jquery插件,相信很多人都用过,我们项目中使用的是3.7.6版本的,一般我们在开发的时候都是使用的火狐或者是谷歌浏览器,使用 niceScroll 没有什么问题, ...
- 使用@CrossOrigin实现跨域请求
1.毕设使用的是react+java开发的网上书城,大家都知道react主要是视图(表现层或页面),数据的处理还是通过java来实现的,所以我的毕设相当于是两个项目组成的,一个是前端项目,一个是后台项 ...
- svn突然不能用了!
case:周五下班将电脑关机,带回家本来打算周末加班的:但是后来周末有事,没有加班,周六和周末电脑根本没有开机.本周一过来开机,打开eclipse准备更新代码的时候,突然发现与资源库同步操作的时候报错 ...
- 剑指offer 面试题5 : 从尾到头打印链表
题目: 输入一个链表的头结点,从尾到头反过来打印出每个节点的值.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 思路: 通常 ...
- Selenium2+python自动化27-查看selenium API【转载】
前言 前面都是点点滴滴的介绍selenium的一些api使用方法,那么selenium的api到底有多少呢?本篇就叫大家如何去查看selenium api,不求人,无需伸手找人要,在自己电脑就有. p ...
- native,strictfp,transient,volatile什么java?
1. native 簡單講,呼叫其他語言(c,c++之類)做出來的dll做法1.利用java做個介面供其他語言實作(也就是宣告成native)2.用javah產出.h:3.用其他語言實現native方 ...