您的位置:首页 > 运维架构

使用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 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
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;


}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: