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 生成)

程序的大致过程如下:
-
GLUT初始化和设置显示模式
-
初始化窗口信息
-
注册回调函数
-
进入事件处理循环
-
定义回调函数
GLUT初始化:
GLUTAPI
void
GLUTAPIENTRY glutInit(
int
*
argcp,
char
**
argv);
设置显示模式:
GLUTAPI
void
GLUTAPIENTRY glutInitDisplayMode(unsigned
int
mode);
初始化窗口信息:
注册回调函数:
进入事件处理循环
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(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;
}
