VC++配置OpenGL开发环境
目录
第1章配置
配置就是将OpenGL的头文件(*.h)、库文件(*.lib)、动态库文件(*.dll)复制到相应的目录内。
如下图所示,有三个文件夹和三个批处理文件。
图1.1
文件夹bin用来存放*.dll文件,如:glut32.dll。注意:32位的dll文件存放在x86子目录内;64位的dll文件存放在x64子目录内。
文件夹inc用来存放*.h文件,如:glew.h。
文件夹lib用来存放*.lib文件,如:glut32.lib。注意:32位的lib文件存放在x86子目录内;64位的lib文件存放在x64子目录内。
注意:本文不考虑安腾处理器(Itanium)。
运行setup.bat,将把bin、inc、lib内的文件复制到相应的目录内。其内容如下所示:
if defined ProgramFiles(x86) goto x64 call x86 goto :eof :x64 call x64 |
setup.bat的工作为判断环境变量ProgramFiles(x86)是否已被定义。如果该环境变量已被定义,说明操作系统是64位的,将运行x64.bat;如果该环境变量未被定义,说明操作系统是32位的,将运行x86.bat。
x86.bat的内容如下
rem copy *.dll xcopy .\bin\x86\*.dll %windir%\System32 /Y /R :vc6 set vcPath="%ProgramFiles%\Microsoft Visual Studio\VC98" if not exist %vcPath% goto vc2002 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2002 set vcPath="%ProgramFiles%\Microsoft Visual Studio .NET\Vc7\PlatformSDK" if not exist %vcPath% goto vc2003 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2003 set vcPath="%ProgramFiles%\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" if not exist %vcPath% goto vc2005 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2005 set vcPath="%ProgramFiles%\Microsoft Visual Studio 8\VC\PlatformSDK" if not exist %vcPath% goto vc2008 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2008 set vcPath="%ProgramFiles%\Microsoft SDKs\Windows\v6.0A" if not exist %vcPath% goto vc2010 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2010 set vcPath="%ProgramFiles%\Microsoft SDKs\Windows\v7.0A" if not exist %vcPath% goto vc2012 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R xcopy .\lib\x64\*.lib %vcPath%\Lib\x64 /Y /R :vc2012 set vcPath="%ProgramFiles%\Microsoft SDKs\Windows\v7.1A" if not exist %vcPath% goto vc2013 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2013 set vcPath="%ProgramFiles%\Windows Kits\8.0\Include\um\GL" if not exist %vcPath% goto vc2015 xcopy .\inc\*.h %vcPath% /Y /R xcopy .\lib\x86\*.lib "%ProgramFiles%\Windows Kits\8.0\Lib\win8\um\x86" /Y /R xcopy .\lib\x64\*.lib "%ProgramFiles%\Windows Kits\8.0\Lib\win8\um\x64" /Y /R :vc2015 set vcPath="%ProgramFiles%\Windows Kits\8.1\Include\um\GL" if not exist %vcPath% goto vc20XX xcopy .\inc\*.h %vcPath% /Y /R xcopy .\lib\x86\*.lib "%ProgramFiles%\Windows Kits\8.1\Lib\winv6.3\um\x86" /Y /R xcopy .\lib\x64\*.lib "%ProgramFiles%\Windows Kits\8.1\Lib\winv6.3\um\x64" /Y /R :vc20XX |
x64.bat的内容如下
rem copy *.dll xcopy .\bin\x86\*.dll %windir%\SysWOW64 /Y /R xcopy .\bin\x64\*.dll %windir%\System32 /Y /R :vc6 set vcPath="%ProgramFiles(x86)%\Microsoft Visual Studio\VC98" if not exist %vcPath% goto vc2002 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2002 set vcPath="%ProgramFiles(x86)%\Microsoft Visual Studio .NET\Vc7\PlatformSDK" if not exist %vcPath% goto vc2003 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2003 set vcPath="%ProgramFiles(x86)%\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK" if not exist %vcPath% goto vc2005 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2005 set vcPath="%ProgramFiles(x86)%\Microsoft Visual Studio 8\VC\PlatformSDK" if not exist %vcPath% goto vc2008 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2008 set vcPath="%ProgramFiles%\Microsoft SDKs\Windows\v6.0A" if not exist %vcPath% goto vc2010 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R xcopy .\lib\x64\*.lib %vcPath%\Lib\x64 /Y /R :vc2010 set vcPath="%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A" if not exist %vcPath% goto vc2012 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R xcopy .\lib\x64\*.lib %vcPath%\Lib\x64 /Y /R :vc2012 set vcPath="%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A" if not exist %vcPath% goto vc2013 xcopy .\inc\*.h %vcPath%\Include\GL /Y /R xcopy .\lib\x86\*.lib %vcPath%\Lib /Y /R :vc2013 set vcPath="%ProgramFiles(x86)%\Windows Kits\8.0\Include\um\GL" if not exist %vcPath% goto vc2015 xcopy .\inc\*.h %vcPath% /Y /R xcopy .\lib\x86\*.lib "%ProgramFiles(x86)%\Windows Kits\8.0\Lib\win8\um\x86" /Y /R xcopy .\lib\x64\*.lib "%ProgramFiles(x86)%\Windows Kits\8.0\Lib\win8\um\x64" /Y /R :vc2015 set vcPath="%ProgramFiles(x86)%\Windows Kits\8.1\Include\um\GL" if not exist %vcPath% goto vc20XX xcopy .\inc\*.h %vcPath% /Y /R xcopy .\lib\x86\*.lib "%ProgramFiles(x86)%\Windows Kits\8.1\Lib\winv6.3\um\x86" /Y /R xcopy .\lib\x64\*.lib "%ProgramFiles(x86)%\Windows Kits\8.1\Lib\winv6.3\um\x64" /Y /R :vc20XX |
注意:x64.bat 中vc2008是比较特殊的:它的目标目录是%ProgramFiles%,而不是%ProgramFiles(x86)%;
第2章核心文件
2.1 核心文件
核心文件有6个,如下表所示:
头文件 |
库文件 |
动态库文件 |
gl.h |
opengl32.lib |
opengl32.dll |
glu.h |
glu32.lib |
glu32.dll |
以gl开头的OpenGL函数,一般都被封装在opengl32.dll内。编程时,需要包含gl.h,编译时需要链接opengl32.lib。
以glu开头的OpenGL函数,一般都被封装在glu32.dll内。编程时,需要包含glu.h,编译时需要链接glu32.lib。
vc6至vc2015自带gl.h、glu.h、opengl32.lib、glu32.lib这四个文件。其中的lib文件还分为x86、x64、IA64(Itanium)三个版本。
Windows系统自带opengl32.dll和glu32.dll。这两个文件的使用,下文会进行说明。
注意:VC++自带的*.h、*.lib,其版本为1.1;Windows自带的*.dll,其版本从1.1到4.X(应该与显卡驱动有关)。要使用OpenGL 1.2 至 4.X 新增的函数,需要另行处理,详见下文。
2.2 编译时使用核心文件
编译时核心文件的使用请参考如下面代码:
#include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") |
即包含头文件gl.h和glu.h,链接时使用opengl32.lib和glu32.lib。
注意:网上下载的压缩包内有时能够发现这些文件:opengl.lib、opengl.dll、glu.lib、glu.dll,它们与opengl32.lib、opengl32.dll、glu32.lib、glu32.dll的区别为:前者是SGI实现的OpenGL,后者是微软实现的OpenGL。
2.3 运行时使用核心文件
编译生成的.exe文件,在运行时需要opengl32.dll和glu32.dll这两个文件。
这两个文件Windows系统自带。32位操作系统下,它们位于%windir%\System32目录下,即一般位于C:\Windows\System32。64位操作系统下,32位程序与64位程序所需要的opengl32.dll、glu32.dll分为两套:64位的dll文件位于%windir%\System32;32位的dll文件位于%windir%\SysWOW64。
2.4 依赖关系
opengl32.dll和glu32.dll在运行时是相互依赖的,即opengl32.dll导入了glu32.dll内部的一些函数,glu32.dll也导入了opengl32.dll内部的一些函数。如下图所示:
图2.1
第3章 AUX
首先需要说明的是:AUX是OpenGL 1.0使用的辅助库,它已经过时。新编写的OpenGL程序里最好不要再使用它。
3.1 AUX的作用
直接使用gl和glu编写OpenGL程序,是一件比较繁琐的工作。以NeHe OpenGL教程第一课的代码为例,什么都没有绘制的代码量就将近四百行了。
AUX辅助库的作用就是为了简化OpenGL的编码。
3.2 相关文件
AUX相关文件有两个:glaux.h、glaux.lib。其中glaux.lib是静态库,所以运行时不再需要glaux.dll。
vc6至vc2005自带这两个文件,vc2008后不再自带。vc2008~vc2015要使用AUX,可将glaux.h、glaux.lib从vc6的安装目录复制到vc2008~vc2015的安装目录下。
3.3 使用AUX
下面是使用AUX的示例代码。它只有二十行左右,大大简化了编码。
#include <windows.h> #include <GL/gl.h> #pragma comment(lib,"OpenGL32.lib") #include <GL/glaux.h> #pragma comment(lib,"glaux.lib") int main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB); auxInitPosition (0, 0, 500, 500); auxInitWindow (argv[0]); glBegin(GL_LINE_STRIP); glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5); glEnd(); glFlush(); Sleep(10000); return 0; } |
第4章 GLUT
4.1 GLUT的作用
从OpenGL 1.1开始,出现了GLUT(OpenGL Utility Tookit)。它与AUX的作用类似,也是为了简化OpenGL编码。此外,由它编写的代码还能够实现跨平台。
可以将GLUT看做是AUX的升级版。
4.2 相关文件
GLUT相关文件有三个:glut.h、glut32.lib、glut32.dll。
VC++和Windows系统不自带这些文件,需要下载。网址为:
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
解压后,将glut.h复制到图1.1中的inc目录;将glut32.lib复制到图1.1中的lib\x86目录;将glut32.dll复制到图1.1中的bin\x86目录。然后运行setup.bat,复制文件到相应的目录内。
4.3 使用GLUT
使用GLUT非常简单,只要包含glut.h头文件即可,即:
#include <GL/glut.h> |
如下内容节选自glut.h
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #ifdef GLUT_USE_SGI_OPENGL #pragma comment (lib, "opengl.lib") #pragma comment (lib, "glu.lib") #pragma comment (lib, "glut.lib") #else #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #pragma comment (lib, "glut32.lib") #endif |
可见:
1、自动包含gl.h和glu.h;
2、自动链接opengl32.lib、glu32.lib、glut32.lib。
4.4 编译GLUT
glutdlls37beta.zip里没有64位的glut32.lib、glut32.dll。此时有两种解决方案:一是下载64位的glut32.lib、glut32.dll;二是下载GLUT的源代码(如:glut-3.7.6-src.zip),然后重新编译一遍。
有了源代码,还可以编译生成静态库,这样在运行程序时就不再需要glut32.dll了。
4.5 替代产品
GLUT也是一款较老的产品,它的源代码早已不再更新。如果想编译GLUT,又找不到源代码,就可以使用一些替代产品,如:Freeglut。
Freeglut的下载地址如下:
http://sourceforge.net/projects/freeglut/files/
第5章 GLEXT
首先需要说明的是:GLEXT已经过时,可用GLEW代替它。
5.1 GLEXT的作用
上文提到:VC++自带的*.h、*.lib,其版本为1.1;Windows自带的*.dll,其版本从1.1到4.X。这就产生一个问题:OpenGL32.dll里可能有某些函数(如:glTexImage3D),在gl.h和OpenGL32.lib里没有相应的声明,导致程序无法使用这些函数。
GLEXT就是用来扩展gl.h和OpenGL32.lib的,经过扩展后就可以使用OpenGL32.dll里的高版本函数了。
5.2 相关文件
GLEXT的相关文件:glcorearb.h、glext.h、wglext.h、glext.lib、glext.dll。
glcorearb.h似乎没有什么用处。glext.h里包含了以gl开头的函数声明,这些函数都是gl.h里所没有声明的函数,也就是从 OpenGL 1.2 开始逐步增加的函数。wglext.h里包含了以wgl开头的函数声明,这些函数只能在Windows平台上使用。
VC++和Windows系统不自带这些文件,需要下载。网址为:
http://sourceforge.net/projects/glextwin32/files/
下载glext.zip,解压后将glext.h、wglext.h复制到图1.1中的inc目录;将glext.lib复制到图1.1中的lib\x86目录;将glext.dll复制到图1.1中的bin\x86目录。然后运行setup.bat,复制文件到相应的目录内。
如果想自己编译生成glext.lib、glext.dll,可在上述网址下载glext_src.zip。
5.3 使用GLEXT
下面以使用OpenGL 1.2里的函数glTexImage3D为例,说明如何使用GLEXT。一共有两种方法。
5.3.1 使用wglGetProcAddress
参考如下代码:
#include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #include <GL/glext.h> #pragma comment(lib,"glext.lib") void init(void) { PFNGLTEXIMAGE3DPROC pfn = (PFNGLTEXIMAGE3DPROC)wglGetProcAddress("glTexImage3D"); if(pfn) { (*pfn)(GL_TEXTURE_3D, 0, GL_RGB, iWidth, iHeight ,iDepth, 0, GL_RGB, GL_UNSIGNED_BYTE, image); } } |
语句(PFNGLTEXIMAGE3DPROC)wglGetProcAddress("glTexImage3D")从OpenGL32.dll里找到函数glTexImage3D的地址,将其强制转换为PFNGLTEXIMAGE3DPROC型的函数指针。接下来的(*pfn)(...);相当于调用glTexImage3D。
5.3.2 使用glext.dll导出函数
参考如下代码:
#include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glu32.lib") #define GL_GLEXT_PROTOTYPES #include <GL/glext.h> #pragma comment(lib,"glext.lib") void init(void) { glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, iWidth, iHeight, iDepth, 0, GL_RGB, GL_UNSIGNED_BYTE, image); } |
首先,它多了一条语句#define GL_GLEXT_PROTOTYPES。这样的话,glext.h里就有了函数glTexImage3D的声明。
代码glTexImage3D(...);会调用glext.dll的导出函数glTexImage3D。后者会在OpenGL32.dll里找到函数glTexImage3D,并执行该函数。
这种方法比使用wglGetProcAddress方便些,但是其效率估计会低一些。而且,编译生成glext.dll时,使用的是C++编译器,导致只有C++程序才能链接glext.lib。解决办法就是下载glext_src.zip,将.cpp文件的扩展名更改为.c,然后重新编译一遍。
第6章 GLEW
GLEW(The OpenGL Extension Wrangler Library)与GLEXT的功能相似。
6.1 相关文件
GLEW的相关文件如下:
glew.h GLEW头文件。函数名以glew开头
wglew.h GLEW针对Windows平台的头文件。函数名以wglew开头
glxew.h GLEW针对Linex平台的头文件
glew32s.lib 静态库
glew32.lib 链接glew32.dll的库文件
glew32.dll 动态库文件
VC++和Windows系统不自带这些文件,需要下载。网址为:
http://sourceforge.net/projects/glew/files
以目前的最新版1.13.0为例,有三个文件
glew-1.13.0-win32.zip Windows平台下编译的结果文件(不含源代码)
glew-1.13.0.zip 源代码(Windows)
glew-1.13.0.tgz 源代码
glew-1.13.0.zip与glew-1.13.0.tgz的区别仅仅在于:前者文本文件的行结束符为\r\n;后者文本文件的行结束符为\n(为苹果电脑准备的?)。
解压glew-1.13.0-win32.zip后,将相关文件复制到图1.1中的三个目录内。然后运行setup.bat。注意区分32位和64位的.lib和.dll文件。还要注意mx(multi context)版本的文件(*mx.lib和*mx.dll)它们用于多窗口多线程显示。
6.2 使用GLEW
下面以使用OpenGL 1.2里的函数glTexImage3D为例,说明如何使用GLEW。参考如下代码:
#include <GL/glew.h> #pragma comment(lib,"glew32.lib") #include <GL/glut.h> void init(void) { ... ... ... glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, iWidth, iHeight, iDepth, 0, GL_RGB, GL_UNSIGNED_BYTE, image); ... ... ... } int main(int argc, char** argv) { ... ... ... glutCreateWindow(argv[0]); glewInit(); ... ... ... return 0; } |
说明:
1、#include <GL/glew.h> 必须在 #include <GL/gl.h> 的前面;
2、#pragma comment(lib,"glew32.lib")将自动链接glew32.lib;
3、需要在创建窗口(glutCreateWindow)后调用函数glewInit。
VC++配置OpenGL开发环境的更多相关文章
- VC 6中配置OpenGL开发环境
2010,2012中配置类似 http://hi.baidu.com/yanzi52351/item/f9a600dffa4caa4ddcf9be1d VC 6中配置OpenGL开发环境 这里,我习惯 ...
- Windows 7 Visual Studio 2008配置OpenGL开发环境
Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...
- VS2010配置OpenGL开发环境
OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...
- VS2010配置OpenGL开发环境(转)
OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...
- vs2015配置OpenGL开发环境
先吐槽下,不知道微软怎么整的,从win7开始,OpenGL的头文件更改到windows SDK中,不安装就不能用. 更搞笑的是,在win10下,vs2015安装还报win sdk安装失败,这典型的自己 ...
- [OpenGL]VS2010配置OpenGL开发环境
opengl概述 OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口. OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任 ...
- 在VS2017配置OpenGL开发环境
这个方法适合初学者使用,较为简单方便.第一,你的VS2017一定要安装了C/C++开发组件可以打开Visual Studio Installer来查看另外,确定你有安装NuGet包管理器,在单个组件中 ...
- macOS Mojave配置OpenGL开发环境
---恢复内容开始--- 前言: 本文写作目的: 是由于本人参考 csdn原文 的方法配置环境时踩了很多坑,所以在此写一篇文防止以后用到. 工具: Xcode CMake 步骤: 准备工作: Xcod ...
- win7 64位系统,vs2010下配置OpenGL开发环境
glut下载地址: http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 或者:http://user.xmission. ...
随机推荐
- 系统进程的Watchdog
编写者:李文栋 /rayleeya http://rayleeya.iteye.com/blog/1963408 3.1 Watchdog简介 对于像笔者这样没玩过硬件的纯软程序员来说,第一次看到这个 ...
- nginx配置 location root alias
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...
- ThreadGroup
http://blog.csdn.net/a352193394/article/details/39323427
- BZOJ1017魔兽地图DotR 樹形DP
@(BZOJ)[樹形DP, 三維DP] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA ...
- 转:c++ 11 新特性
声 明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11(and Why You Should Care)&g ...
- Maven实现多个项目关联自动化构建(maven-invoker-plugin插件的使用)
以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_build_automation.html: 注意: ...
- .net core mvc启动顺序以及主要部件2
原文:.net core mvc启动顺序以及主要部件2 前一篇提到WebHost.CreateDefaultBuilder(args)方法创建了WebHostBuilder实例,WebHostBuil ...
- jmeter.properties控制聚合报告的用户响应时间设置和smmary results
jmeter.properties的配置Summariser控制输出Summary Results,可以显式rt和tps等信息 Aggregate Report配置可以控制聚合报告的内容,控制90%用 ...
- 【转】Spring框架深入理解
参考这篇文章: http://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring内部分为Beans, Context 和 ...
- Swift标识符和keyword
不论什么一种计算机语言都离不开标识符和keyword,下面我们将具体介绍Swift标识符和keyword. 标示符 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等指定的名字.构成标识符的 ...