使用GLUT for win32 学习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 
< GL / glut.h >

#include 
< stdlib.h >

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(
00, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(
-ar, ar, -1.01.02.0100.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.0f0.0f0.0f1.0f } ;
const  GLfloat light_diffuse[]   =   1.0f1.0f1.0f1.0f } ;
const  GLfloat light_specular[]  =   1.0f1.0f1.0f1.0f } ;
const  GLfloat light_position[]  =   2.0f5.0f5.0f0.0f } ;

const  GLfloat mat_ambient[]     =   0.7f0.7f0.7f1.0f } ;
const  GLfloat mat_diffuse[]     =   0.8f0.8f0.8f1.0f } ;
const  GLfloat mat_specular[]    =   1.0f1.0f1.0f1.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;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值