使用GLUT for win32 学习openGL
2012-07-26 11:25
447 查看
GLUT(The openGL Utility Toolkit),openGL实用工具箱,是一个与窗口系统无关的openGL编程工具箱. 最早由Mark Robins编写.它实现了一个简单的窗口应用程序接口,使用它可以更加轻松的学习openGL,让我们集中注意力在openGL上,而不必关心所在的窗口系统.GLUT提供了可移植的API,所以你可以编写出在所有PC和工作站平台上都可以运行的openGL程序.
GLUT是设计用来构建小型的openGL程序.GLUT非常适合用来学习openGL和开发简单的openGL程序.GLUT不是一个功能完备的工具箱.所以需要复杂用户接口的大型应用最好是用与窗口系统有关的工具箱.
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
GLUTGLUT的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 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(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;
}
GLUT是设计用来构建小型的openGL程序.GLUT非常适合用来学习openGL和开发简单的openGL程序.GLUT不是一个功能完备的工具箱.所以需要复杂用户接口的大型应用最好是用与窗口系统有关的工具箱.
The current version of the GLUT API is 3. The current source code distribution is GLUT 3.7. |
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
GLUTGLUT的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 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(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;
}
相关文章推荐
- 使用GLUT for win32 学习openGL
- OpenGL入门学习之七——使用光照来表现立体感
- 【OpenGL】使用Unity来学习OpenGL
- OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function)
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
- OpenCV学习笔记(15)使用OpenGL显示双目视觉三维重构效果 (转)
- OpenGL学习: 光照系列2-材质和lighting maps使用
- OpenGL学习脚印: 使用索引绘图(index drawing)
- win32sdk学习-Richedit组件使用
- SDL入门学习续-在SDL中使用OpenGL
- android 中的openGL使用学习笔记
- OpenGL入门学习——第十一课 纹理的使用入门
- 【OpenGL学习】使用Shader做图像处理
- OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)
- openGl-ES学习与使用心得-入门级
- Win32学习笔记——菜单和加速键资源的使用
- 使用openframeworks无需配置学习新版本opengl
- SDL入门学习续-在SDL中使用OpenGL
- OpenGL入门学习之九——使用混合来实现半透明效果
- win32学习之 --------GDI使用 代码记录