VC6.0上安装OpenGL的glut库

Windows环境下的GLUT下载地址:(大小约为118k)
http://www.openglsource.com/download/download.htm

OpenGL的例子大都需要用到OpenGL应用工具包:GLUT库,下面讲讲怎样安装

Visual C++ 6.0 安装glut库:
1。下载GLUT库:http://www.openglsource.com/download/download.htm
2。将压缩包内的glut.h放到.../Microsoft Visual Studio/VC98/Include/GL目录下
    将glut32.lib放到.../Microsoft Visual Studio/VC98/Lib目录下
    将glut32.dll放到X:/windows/systom32目录下(win98用户放到X:/windows/systom目录下)

OpenGL是目前用于开发可移植的、可交互的2D和3D图形应用程序的首选环境,也是目前应用最广泛的计算机图形标准。OpenGL是SGI公司开发的一套的计算机图形处理系统,是图形硬件的软件接口,GL代表图形库(Graphics Library)。OpenGL具有可移植性,任何一个OpenGL应用程序无须考虑其运行环境所在平台与操作系统,在任何一个遵循OpenGL标准的环境下都会产生相同的可视效果。

OpenGL不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。当我们说某个程序是基于OpenGL的或者说它是个OpenGL程序是,意思是说它是用某种编程语言如C或C++编写的,其中调用了一个或多个OpenGL库函数。作为一种API,OpenGL遵循C语言的调用约定。

OpenGL主要包括三个函数库,它们是核心库、实用函数库和编程辅助库。核心库中包含了OpenGL最基本的命令函数。核心库提供了一百多个函数,这些函数都以”gl”为前缀,用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等所有的二维和三维图形操作。实用函数库是比核心库更高一层的函数库,它提供四十多个函数,这些函数都以”glu”为前缀。由于OpenGL是一个图形标准,是独立于任何窗口系统或操作系统的,在OpenGL中没有提供窗口管理和消息事件响应的函数,也没有鼠标和键盘读取事件的功能,所以在编程辅助库提供了一些基本的窗口管理函数、事件处理函数和简单的事件函数。这类函数以”aux”作为前缀。值得一提的是,目前AUX编程辅助库已经很大程度上被GLUT库取代了。以下介绍以GLUT库为例。
     GLUT代表OpenGL应用工具包(OpenGL Utility Toolkit),是一个与窗口系统无关的工具包。它作为AUX库的功能更强的替代品,用于隐藏不同窗口系统API的复杂性。GLUT的子程序的前缀使用”glut”。

设置Visual C/C++ 6.0
  Visual C/C++的工程有两个重要选项: Console (控制台) 和 Win32. 应用程序将会有两个窗口: 一个控制台窗口, 以及一个 OpenGL 窗口. 选择 Win32 仍然可以让你在不需要关心Windows程序设计的情况下编写 GLUT 程序. 你需要做以下设置:
  选择 Project -> settings
  选择 Link 选项卡
  从 Category 中选择 Output
  在 Entry-point synmbol 文本框中键入 mainCRTStartup
  对于已存在的控制台工程, 有一个简单的办法将它转换成Win32应用程序:
  根据上面的步骤修改入口点
  在 Project options 文本框中用 subsystem:windows 覆盖 subsystem:console
  或者你可以直接在你的源代码开头处添加:
    
  代码  
  // #pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" )   
  注意: 这是一行注释  
  如此一来, 应用程序就不会出现控制台窗口, 而只是一个 OpenGL 窗口了. 在Visual C/C++ 中你需要一下步骤来连接一个 GLUT 程序:
  选择 Proejct/Settings
  选择 LINK 选项卡
  添加一下文件到 Object/library: opengl32.lib glut32.lib glu32.lib
  请注意: 同时添加了glu32.lib 和 opengl32.lib. 他们是标准OpenGL库.

        建造应用程序的主函数(main function). 主函数将会将会完成程序的初始化并启动事件处理循环. 所有函数都有一个前缀 glut , 初始化函数的前缀是 glutInit.
        首先必须调用函数 glutInit.
   
  代码
  void glutInit(int *argc, char **argv);
  //参数:
  //argc - 一个指向主函数 argc 变量的 未经修改 的指针.
  //argv - 一个指向主函数 argv 变量的 未经修改 的指针.
     
  初始化 GLUT 本身以后, 要定义显示窗口. 首先, 建立窗口的位置, 例如: 在窗口的左上角. 要实现这个功能, 需要调用函数 glutInitWindowsPosition.
  
  代码  
  void glutInitWindowPosition(int x, int y);
  //参数:
  //x- 距离屏幕左边的像素数. 默认值是 -1, 由Windows系统决定窗口的位置. 如果没有没有采用默认值, 那么你应该使用一个合适正值作为实参.
  //y- 距离屏幕屏幕顶端的像素数, 其余同上.
  请注意, 这些参数只是给窗口管理器的一个建议值. 创建的窗口可能会处于不同的位置上, 不过这很少发生. 接下来要决定窗口的大小, 为了做到这一点, 需要使用函数 glutInitWindowSize.
  
  代码
  void glutInitWindowSize(int width, int height);
  参数:
  width - 窗口的宽度
  height - 窗口的高度
  
  同样的, 高和宽也只是一个建议值, 请避免使用负值.
  然后需要定义显示模式, 使用 glutInitDisplayMode 函数.
  
  代码  
  void glutInitDisplayMode(unsigned int mode)
  参数:
  mode - 指定显示模式 
  //mode 参数是一个 GLUT 预定义常数的复合布尔型 (位或). 可以使用 mode 来指定颜色, 以及缓冲区的数量和类型.
  
  这些常数是:
  GLUT_RGBA or GLUT_RGB - 默认颜色模式
  GLUT_INDEX - 颜色索引(?) 模式
  
  显示模式允许你选择单或双缓冲区窗口. 相关常数是:
  GLUT_SINGLE - 单缓冲区窗口
  GLUT_DOUBLE - 双缓冲区, 平滑动画需要
  
  这里还有更多关于缓冲区的常数:
  GLUT_ACCUM - 聚集缓冲区
  GLUT_STENCIL - The stencil buffer (...翻译不出来)
  GLUT_DEPTH - 深度缓冲区
  
  现在, 假如想要创建一个RGB窗口, 单缓冲以及一个深度缓冲区. 你需要把相关的常数去 OR 在一起来创建一个正确的常口
  
  代码
  ...
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT DEPTH);
  ... 
  经过以上步骤, 可以调用 glutCreateWindow 函数了
  
  代码  
  int glutCreateWindow(char *title);
  
  参数:
  title - 窗口标题
  
  glutCreateWindows 函数的返回值是索创建窗口的标示符. 以后会用到这个标示符.
  现在, 把上面的代码集合起来, 看看一次完整的窗口初始化:
  
  代码
  
  #include
  
  void main(int argc, char **argv) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGB);
  glutInitWindowPosition(50,100);
  glutInitWindowSize(400,300);
  glutCreateWindow("An Example OpenGL Program");
  }

        如果你运行了这段代码, 那么你将看到一个黑色的控制台窗口, 但是没有任何OpenGL窗口, 几秒钟以后, 这个窗口也消失了. 在我们开始渲染之前 我们还要做两件事情: 首先是告诉 GLUT 系统负责渲染的函数:
  我们来创建一个渲染函数的例子. 这个函数将会清空颜色缓冲区, 并画出一条直线:
  
  代码
        void lineSegment(void)
        {
            glClear(GL_COLOR_BUFFER_BIT);
            glColor3f(1.0,0.0,0.0); 
            glBegin(GL_LINES);
                glVertex2i(180,15);
                glVertex2i(10,145);
            glEnd();
            glFlush();
        }
  
  可以给函数起任意的名字. 然而, 必须告诉 GLUT 来使用这个函数进行渲染. 这叫做 注册回叫(callback) 函数. GLUT 将会在需要渲染的时候呼叫这个函数. 现在我们来告诉 GLUT 一旦我们的窗口被破坏(注意: 当窗口第一次被创建的时候, 这个函数也会被呼叫), 就调用renderScene函数. GLUT 中有一个函数接受一个函数指针作为参数, 它将这个指针指向的函数作为渲染函数.
  
  代码
  void glutDisplayFunc(void (*func)(void));
  参数:
  func - 渲染函数指针, NULL在这里非法
  
  我们最后要做, 就是让程序进入事件处理循环. GLUT 给我们准备了一个函数来使程序进入一个无限循环(死循环), 永远在等待下一个需要处理的事件. 这个函数就是 glutMainLoop:
  
  代码
  
  void glutMainLoop(void)

       该函数必须是程序中的最后一个,它显示初始图形并使程序进入检查鼠标或键盘等设备输入的无穷循环之中.

一个简单的OpenGL程序:

#include <windows.h>
#include <GL/glut.h>

void init(void)
{
    glClearColor(1.0,1.0,1.0,0.0);        //Set display-window color to white.
   
    glMatrixMode(GL_PROJECTION);        //Set projection parameters.
    gluOrtho2D(0.0,200.0,0.0,150.0);
}

void lineSegment(void)
{
    glClear(GL_COLOR_BUFFER_BIT);        //Clear display window.
   
    glColor3f(1.0,0.0,0.0);                //Set line segment color to red.
    glBegin(GL_LINES);
        glVertex2i(180,15);                //Specify line-segment geometry.
        glVertex2i(10,145);
    glEnd();

    glFlush();            //Process all OpenGL routines as quickly as possible.
}

void main(int argc,char* argv)
{
    glutInit(&argc,&argv);                //Initialize GLUT.
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //Set display mode.
    glutInitWindowPosition(50,100);        //Set top-left display-window position.
    glutInitWindowSize(400,300);        //Set display-window width and height.
    glutCreateWindow("An Example OpenGL Program");    //Create display window.

    init();                                //Execute initialization procedure.
    glutDisplayFunc(lineSegment);        //Send graphics to display window.
    glutMainLoop();                        //Display everything and wait.
}

posted on 2011-08-30 13:27  伪君  阅读(1158)  评论(0编辑  收藏  举报

导航