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的WIN32(Windows 95,98,Me,NT,2000,XP)版本由by Nate Robins编写,现在的版本是3.7.6.
简单的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 glutInitWindowSize(
int
width,
int
height);
GLUTAPI void GLUTAPIENTRY glutInitWindowPosition( int x, int y);
GLUTAPI int GLUTAPIENTRY glutCreateWindow( const char * title);
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
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 ));
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(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;
}
* 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;
}