zoukankan      html  css  js  c++  java
  • VC++配置OpenGL开发环境

    1配置    1

    2核心文件    6

    2.1 核心文件    6

    2.2 编译时使用核心文件    6

    2.3 运行时使用核心文件    7

    2.4 依赖关系    7

    3 AUX    8

    3.1 AUX的作用    8

    3.2 相关文件    8

    3.3 使用AUX    8

    4 GLUT    10

    4.1 GLUT的作用    10

    4.2 相关文件    10

    4.3 使用GLUT    10

    4.4 编译GLUT    11

    4.5 替代产品    11

    5 GLEXT    12

    5.1 GLEXT的作用    12

    5.2 相关文件    12

    5.3 使用GLEXT    12

    5.3.1 使用wglGetProcAddress    13

    5.3.2 使用glext.dll导出函数    13

    6 GLEW    15

    6.1 相关文件    15

    6.2 使用GLEW    15

    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,将把bininclib内的文件复制到相应的目录内。其内容如下所示:

    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 .inx86*.dll %windir%System32 /Y /R

     

    :vc6

    set vcPath="%ProgramFiles%Microsoft Visual StudioVC98"

    if not exist %vcPath% goto vc2002

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2002

    set vcPath="%ProgramFiles%Microsoft Visual Studio .NETVc7PlatformSDK"

    if not exist %vcPath% goto vc2003

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2003

    set vcPath="%ProgramFiles%Microsoft Visual Studio .NET 2003Vc7PlatformSDK"

    if not exist %vcPath% goto vc2005

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2005

    set vcPath="%ProgramFiles%Microsoft Visual Studio 8VCPlatformSDK"

    if not exist %vcPath% goto vc2008

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2008

    set vcPath="%ProgramFiles%Microsoft SDKsWindowsv6.0A"

    if not exist %vcPath% goto vc2010

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2010

    set vcPath="%ProgramFiles%Microsoft SDKsWindowsv7.0A"

    if not exist %vcPath% goto vc2012

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

    xcopy .libx64*.lib %vcPath%Libx64 /Y /R

     

    :vc2012

    set vcPath="%ProgramFiles%Microsoft SDKsWindowsv7.1A"

    if not exist %vcPath% goto vc2013

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2013

    set vcPath="%ProgramFiles%Windows Kits8.0IncludeumGL"

    if not exist %vcPath% goto vc2015

    xcopy .inc*.h %vcPath% /Y /R

    xcopy .libx86*.lib "%ProgramFiles%Windows Kits8.0Libwin8umx86" /Y /R

    xcopy .libx64*.lib "%ProgramFiles%Windows Kits8.0Libwin8umx64" /Y /R

     

    :vc2015

    set vcPath="%ProgramFiles%Windows Kits8.1IncludeumGL"

    if not exist %vcPath% goto vc20XX

    xcopy .inc*.h %vcPath% /Y /R

    xcopy .libx86*.lib "%ProgramFiles%Windows Kits8.1Libwinv6.3umx86" /Y /R

    xcopy .libx64*.lib "%ProgramFiles%Windows Kits8.1Libwinv6.3umx64" /Y /R

     

    :vc20XX

    x64.bat的内容如下

    rem copy *.dll

    xcopy .inx86*.dll %windir%SysWOW64 /Y /R

    xcopy .inx64*.dll %windir%System32 /Y /R

     

    :vc6

    set vcPath="%ProgramFiles(x86)%Microsoft Visual StudioVC98"

    if not exist %vcPath% goto vc2002

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2002

    set vcPath="%ProgramFiles(x86)%Microsoft Visual Studio .NETVc7PlatformSDK"

    if not exist %vcPath% goto vc2003

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2003

    set vcPath="%ProgramFiles(x86)%Microsoft Visual Studio .NET 2003Vc7PlatformSDK"

    if not exist %vcPath% goto vc2005

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2005

    set vcPath="%ProgramFiles(x86)%Microsoft Visual Studio 8VCPlatformSDK"

    if not exist %vcPath% goto vc2008

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2008

    set vcPath="%ProgramFiles%Microsoft SDKsWindowsv6.0A"

    if not exist %vcPath% goto vc2010

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

    xcopy .libx64*.lib %vcPath%Libx64 /Y /R

     

    :vc2010

    set vcPath="%ProgramFiles(x86)%Microsoft SDKsWindowsv7.0A"

    if not exist %vcPath% goto vc2012

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

    xcopy .libx64*.lib %vcPath%Libx64 /Y /R

     

    :vc2012

    set vcPath="%ProgramFiles(x86)%Microsoft SDKsWindowsv7.1A"

    if not exist %vcPath% goto vc2013

    xcopy .inc*.h %vcPath%IncludeGL /Y /R

    xcopy .libx86*.lib %vcPath%Lib /Y /R

     

    :vc2013

    set vcPath="%ProgramFiles(x86)%Windows Kits8.0IncludeumGL"

    if not exist %vcPath% goto vc2015

    xcopy .inc*.h %vcPath% /Y /R

    xcopy .libx86*.lib "%ProgramFiles(x86)%Windows Kits8.0Libwin8umx86" /Y /R

    xcopy .libx64*.lib "%ProgramFiles(x86)%Windows Kits8.0Libwin8umx64" /Y /R

     

    :vc2015

    set vcPath="%ProgramFiles(x86)%Windows Kits8.1IncludeumGL"

    if not exist %vcPath% goto vc20XX

    xcopy .inc*.h %vcPath% /Y /R

    xcopy .libx86*.lib "%ProgramFiles(x86)%Windows Kits8.1Libwinv6.3umx86" /Y /R

    xcopy .libx64*.lib "%ProgramFiles(x86)%Windows Kits8.1Libwinv6.3umx64" /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

    vc6vc2015自带gl.hglu.hopengl32.libglu32.lib这四个文件。其中的lib文件还分为x86x64IA64Itanium)三个版本。

    Windows系统自带opengl32.dllglu32.dll。这两个文件的使用,下文会进行说明。

    注意:VC++自带的*.h*.lib,其版本为1.1Windows自带的*.dll,其版本从1.14.X(应该与显卡驱动有关)。要使用OpenGL 1.2 4.X 新增的函数,需要另行处理,详见下文。

    2.2 编译时使用核心文件

    编译时核心文件的使用请参考如下面代码:

    #include <windows.h>

    #include <glgl.h>

    #include <glglu.h>

    #pragma comment (lib, "opengl32.lib")

    #pragma comment (lib, "glu32.lib")

    即包含头文件gl.hglu.h,链接时使用opengl32.libglu32.lib

    注意:网上下载的压缩包内有时能够发现这些文件:opengl.libopengl.dllglu.libglu.dll,它们与opengl32.libopengl32.dllglu32.libglu32.dll的区别为:前者是SGI实现的OpenGL,后者是微软实现的OpenGL

    2.3 运行时使用核心文件

    编译生成的.exe文件,在运行时需要opengl32.dllglu32.dll这两个文件。

    这两个文件Windows系统自带。32位操作系统下,它们位于%windir%System32目录下,即一般位于C:WindowsSystem3264位操作系统下,32位程序与64位程序所需要的opengl32.dllglu32.dll分为两套:64位的dll文件位于%windir%System3232位的dll文件位于%windir%SysWOW64

    2.4 依赖关系

    opengl32.dllglu32.dll在运行时是相互依赖的,即opengl32.dll导入了glu32.dll内部的一些函数,glu32.dll也导入了opengl32.dll内部的一些函数。如下图所示:

    图2.1

    3 AUX

    首先需要说明的是:AUXOpenGL 1.0使用的辅助库,它已经过时。新编写的OpenGL程序里最好不要再使用它。

    3.1 AUX的作用

    直接使用glglu编写OpenGL程序,是一件比较繁琐的工作。以NeHe OpenGL教程第一课的代码为例,什么都没有绘制的代码量就将近四百行了。

    AUX辅助库的作用就是为了简化OpenGL的编码。

    3.2 相关文件

    AUX相关文件有两个:glaux.hglaux.lib。其中glaux.lib是静态库,所以运行时不再需要glaux.dll

    vc6vc2005自带这两个文件,vc2008后不再自带。vc2008~vc2015要使用AUX,可将glaux.hglaux.libvc6的安装目录复制到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开始,出现了GLUTOpenGL Utility Tookit)。它与AUX的作用类似,也是为了简化OpenGL编码。此外,由它编写的代码还能够实现跨平台。

    可以将GLUT看做是AUX的升级版。

    4.2 相关文件

    GLUT相关文件有三个:glut.hglut32.libglut32.dll

    VC++Windows系统不自带这些文件,需要下载。网址为:

    http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

    解压后,将glut.h复制到图1.1中的inc目录;将glut32.lib复制到图1.1中的libx86目录;将glut32.dll复制到图1.1中的binx86目录。然后运行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.hglu.h

    2、自动链接opengl32.libglu32.libglut32.lib

    4.4 编译GLUT

    glutdlls37beta.zip里没有64位的glut32.libglut32.dll。此时有两种解决方案:一是下载64位的glut32.libglut32.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.1Windows自带的*.dll,其版本从1.14.X。这就产生一个问题:OpenGL32.dll里可能有某些函数(如:glTexImage3D),在gl.hOpenGL32.lib里没有相应的声明,导致程序无法使用这些函数。

    GLEXT就是用来扩展gl.hOpenGL32.lib的,经过扩展后就可以使用OpenGL32.dll里的高版本函数了。

    5.2 相关文件

    GLEXT的相关文件:glcorearb.hglext.hwglext.hglext.libglext.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.hwglext.h复制到图1.1中的inc目录;将glext.lib复制到图1.1中的libx86目录;将glext.dll复制到图1.1中的binx86目录。然后运行setup.bat,复制文件到相应的目录内。

    如果想自己编译生成glext.libglext.dll,可在上述网址下载glext_src.zip

    5.3 使用GLEXT

    下面以使用OpenGL 1.2里的函数glTexImage3D为例,说明如何使用GLEXT。一共有两种方法。

    5.3.1 使用wglGetProcAddress

    参考如下代码:

    #include <windows.h>

    #include <glgl.h>

    #include <glglu.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 <glgl.h>

    #include <glglu.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

    GLEWThe 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.zipglew-1.13.0.tgz的区别仅仅在于:前者文本文件的行结束符为 ;后者文本文件的行结束符为 (为苹果电脑准备的?)。

    解压glew-1.13.0-win32.zip后,将相关文件复制到图1.1中的三个目录内。然后运行setup.bat。注意区分32位和64位的.lib.dll文件。还要注意mxmulti 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

  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/hanford/p/6028115.html
Copyright © 2011-2022 走看看