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

  • 相关阅读:
    模拟赛12-10
    uva-11235
    中国剩余定理
    待学算法
    A
    动态逆序对
    [BZOJ3011][Usaco2012 Dec]Running Away From the Barn
    题目1007:奥运排序问题(结构体排序)
    题目1006:ZOJ问题(字符串处理)
    题目1005:Graduate Admission(结构体排序)
  • 原文地址:https://www.cnblogs.com/hanford/p/6028115.html
Copyright © 2011-2022 走看看