glut使用示例

glut使用示例
转载请注明作&译者信息,非商业用途。 飘飘白云([email protected])
有了glut省事不少,不用去管烦琐的窗口创建,消息循环什么的,整了一个glut框架,作为以后demo的框架。
上图:
glut使用示例
贴代码:
//============================================================= // 包含头文件 //============================================================= #include <gl/glew.h> // opengl 扩展封装头文件 #include <gl/glut.h> // opengl 实用工具头文件 //============================================================= // 导入lib //============================================================= #pragma comment(lib, "glew32.lib") //============================================================= // 函数声明 //============================================================= void Initialize(); // 初始化应用程序 void Uninitialize(); // 清理应用程序 void DrawFunc(); // glut描绘回调函数 void ReshapeFunc(int width, int height); // glut窗口重置回调函数 void KeyboardFunc(unsigned char key, int x, int y); // glut键盘回调函数 void MouseFunc(int button, int state, int x, int y);// glut鼠标按下与释放回调函数 void MotionFunc(int x, int y); // glut鼠标移动回调函数 void IdleFunc(); // glut空闲处理回调函数 void DrawText(const char* text, float x, float y); // 在屏幕上显示文本 //============================================================= // 全局变量 //============================================================= const static float EPSILON = 0.000001f; const static float PI = 3.1415926f; const static float PI_2 = 6.2831852f; // 窗口相关 const static int g_WindowPosX = 240; const static int g_WindowPosY = 200; int g_WindowWidth = 512; int g_WindowHeight = 384; const char* g_WindowTitle = "OpenGL 飘飘白云(www.cnblogs.com/kesalin)"; // 显示模式:双缓冲,RGBA,深度缓存 const static int g_DisplayMode = (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // GLUT_STENCIL GLUT_ACCUM const static float g_fov = 60.0f; float g_rotateY = 0.0f; // 绕Y轴旋转变量 float g_posX = 0.0f; //============================================================= // main 函数 //============================================================= int main(int argc, char** argv) { // 初始化opengl, glut, glew glutInit(&argc, argv); glutInitDisplayMode(g_DisplayMode); glewInit(); // 创建window glutInitWindowPosition(g_WindowPosX, g_WindowPosY); glutInitWindowSize(g_WindowWidth, g_WindowHeight); glutCreateWindow(g_WindowTitle); // 初始化应用程序 Initialize() ; // 设定glut回调函数 glutDisplayFunc(DrawFunc); glutReshapeFunc(ReshapeFunc); glutKeyboardFunc(KeyboardFunc); glutIdleFunc(IdleFunc); // 进入glut事件处理循环 glutMainLoop(); // 清理应用程序 Uninitialize(); return 0; } //============================================================= // 函数定义 //============================================================= // 在屏幕上显示文本,x 和 y 为屏幕坐标 void DrawText(const char* text, float x, float y) { // 检查OpenGL状态 bool isDepthOpen = false; bool isStencilOpen = false; bool isLightOpen = false; bool isFogOpen = false; if(glIsEnabled(GL_DEPTH_TEST)) { isDepthOpen = true; glDisable(GL_DEPTH_TEST); } if(glIsEnabled(GL_STENCIL_TEST)) { isStencilOpen = true; glDisable(GL_STENCIL_TEST); } if(glIsEnabled(GL_LIGHTING)) { isLightOpen = true; glDisable(GL_LIGHTING); } if(glIsEnabled(GL_FOG)) { isFogOpen = true; glDisable(GL_FOG); } int font = (int)GLUT_BITMAP_8_BY_13; // 设置字体颜色 glColor3f(1.0, 1.0, 0.0); /* * 设置正投影 */ glMatrixMode(GL_PROJECTION); // 保存当前投影矩阵 glPushMatrix(); glLoadIdentity(); gluOrtho2D( 0, g_WindowWidth, 0, g_WindowHeight ); // 反转Y轴(朝下为正方向)(与窗口坐标一致) glScalef(1, -1, 1); // 将原点移动到屏幕左上方(与窗口坐标一致) glTranslatef(0, -g_WindowHeight, 0); glMatrixMode(GL_MODELVIEW); // 保存当前模型视图矩阵 glPushMatrix(); glLoadIdentity(); // 设置文字位置 glRasterPos2f( x, y ); // 依次描绘所有字符(使用显示列表) for(const char* c = text; *c != '/0'; c++) { glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *c); } // 恢复之前保存的模型视图矩阵 glPopMatrix(); glMatrixMode(GL_PROJECTION); // 恢复之前保存的投影矩阵 glPopMatrix(); // 返回模型视图矩阵状态 glMatrixMode(GL_MODELVIEW); // 恢复OpenGL状态 if(isDepthOpen) { glEnable(GL_DEPTH_TEST); } if(isStencilOpen) { glEnable(GL_STENCIL_TEST); } if(isLightOpen) { glEnable(GL_LIGHTING); } if(isFogOpen) { glEnable(GL_FOG); } } // 初始化应用程序 void Initialize() { // 设置清屏颜色 glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 设置视口,投影信息 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.0, 30.0); } // 清理应用程序 void Uninitialize() { // nothing } // 空闲处理 void IdleFunc() { g_rotateY += 0.2f; // 请求重绘 glutPostRedisplay(); } // 描绘函数 void DrawFunc() { // 清屏 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(g_posX, 0.0f, -5.0f); // 描绘圆环 glPushMatrix(); glColor3f (0.0f, 0.0f, 1.0f); glRotatef(g_rotateY, 0.0f, 1.0f, 0.0f); glutSolidTorus(0.2f ,1.0f, 20, 40); glPopMatrix(); // 描绘矩形 glPushMatrix(); glColor3f (0.0f, 1.0f, 1.0f); glBegin(GL_QUADS); glVertex3f (2.0f, -1.5f, 2.0f); glVertex3f (-2.0f, -1.5f, 2.0); glVertex3f (-2.0f, -1.5f, -2.0); glVertex3f (2.0f, -1.50f, -2.0); glEnd(); glPopMatrix(); glPopMatrix(); // 显示文本信息 float x = 10.0f; float y = 20.0f; DrawText("Author: [email protected]", x, y); DrawText("Push /'A/' or /'D/' to move the torus.", x, y + 20.0f); // 交换显示缓冲区 glutSwapBuffers() ; } // 响应窗口重置事件 void ReshapeFunc(int width, int height) { g_WindowWidth = width; g_WindowHeight = height; glViewport(0, 0, g_WindowWidth, g_WindowHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.0, 30.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // 响应按键事件 void KeyboardFunc(unsigned char key, int x, int y) { switch (key) { case 'A': case 'a': // 向左移动 g_posX -= 0.05f; if( g_posX < -4.0f ) { g_posX = -4.0f; } break; case 'D': case 'd': // 向右移动 g_posX += 0.05f; if( g_posX > 4.0f ) { g_posX = 4.0f; } break; default: break; } } // 响应鼠标按下与释放事件 void MouseFunc(int button, int state, int x, int y) { #if 0 switch( button ) { case GLUT_LEFT_BUTTON: { if( state == GLUT_UP ) { } else if( state == GLUT_DOWN ) { } } break; case GLUT_RIGHT_BUTTON: { if( state == GLUT_UP ) { } else if( state == GLUT_DOWN ) { } } break; case GLUT_MIDDLE_BUTTON: { if( state == GLUT_UP ) { } else if( state == GLUT_DOWN ) { } } break; } #endif } // 响应鼠标移动事件 void MotionFunc(int x, int y) { // nothing }