通过GLUT库学习OpenGL

          GLUT(The OpenGL Utility Toolkit),OpenGL实用工具箱,是一个与窗口系统无关的OpenGL编程工具箱. 最早由Mark Robins编写.它实现了一个简单的窗口应用程序接口,使用它可以更加轻松的学习openGL,让我们集中注意力在openGL上,而不必关心所在的窗口系统.GLUT提供了可移植的API,所以你可以编写出在所有PC和工作站平台上都可以运行的OpenGL程序.

          GLUT是设计用来构建小型的OpenGL程序.GLUT非常适合用来学习OpenGL和开发简单的OpenGL程序.GLUT不是一个功能完备的工具箱.所以需要复杂用户接口的大型应用最好是用与窗口系统有关的工具箱.

The current version of the GLUT API is 3.
The current source code distribution is GLUT 3.7.

The toolkit supports:

  • Multiple windows for OpenGL rendering
  • Callback driven event processing
  • Sophisticated input devices
  • An 'idle' routine and timers
  • A simple, cascading pop-up menu facility
  • Utility routines to generate various solid and wire frame objects
  • Support for bitmap and stroke fonts
  • Miscellaneous window management functions

GLUT

GLUT的WIN32(Windows 95,98,Me,NT,2000,XP)版本由by Nate Robins编写,现在的版本是3.7.6.

GLUT FOR WIN32

简单的GLUT程序构造:(利用SOURCE INSIGHT 3.5 生成)

 

程序的大致过程如下:

  1. GLUT初始化和设置显示模式
  2. 初始化窗口信息
  3. 注册回调函数
  4. 进入事件处理循环
  5. 定义回调函数

GLUT初始化:

GLUTAPI  void GLUTAPIENTRY glutInit( int *argcp,  char **argv);

 设置显示模式:

GLUTAPI  void GLUTAPIENTRY glutInitDisplayMode(unsigned  int mode);

初始化窗口信息:

GLUTAPI  void GLUTAPIENTRY glutInitWindowSize( int width,  int height);
GLUTAPI  void GLUTAPIENTRY glutInitWindowPosition( int x,  int y);
GLUTAPI  int GLUTAPIENTRY glutCreateWindow( const  char *title);
    /* and so on */

注册回调函数:

GLUTAPI  void GLUTAPIENTRY glutDisplayFunc( void (GLUTCALLBACK *func)( void));
GLUTAPI  void GLUTAPIENTRY glutReshapeFunc( void (GLUTCALLBACK *func)( int width,  int height));
GLUTAPI  void GLUTAPIENTRY 
                             glutKeyboardFunc( void (GLUTCALLBACK *func)(unsigned  char key,  int x,  int y));
GLUTAPI  void GLUTAPIENTRY glutIdleFunc( void (GLUTCALLBACK *func)( void));
    /* and so on */

 进入事件处理循环

GLUTAPI  void GLUTAPIENTRY glutMainLoop( void);

定义回调函数 

/* 你的回调函数 */

实例,来自于DEV C++ 的默认的GLUT工程。

/*
 * FreeGLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone 
 * and torus shapes in FreeGLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */
#include <Windows.h>
#include <math.h>
#include <stdlib.h>
#include <gl/GL.h>
#include <gl/GLAux.h>
#include <gl/GLU.h>
#include <gl/glut.h>
#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "GLAux.lib")
#pragma comment(lib, "GLU32.lib")
#pragma comment(lib, "GLut32.lib")

static int slices = 16;
static int stacks = 16;

/**//* GLUT callback Handlers */

static void 
resize(int width, int height)
{
    const float ar = (float) width / (float) height;
    
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void 
display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}


static void 
key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void 
idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/**//* Program entry point */

int 
main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("FreeGLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}
运行效果如下:



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值