zoukankan      html  css  js  c++  java
  • Glut框架示例

    Glut框架示例

    本文遵循“署名-非商业用途-保持一致”创作公用协议

    有了glut省事不少,不用去管烦琐的窗口创建,消息循环什么的,整了一个glut框架,作为以后demo的框架。

     
    上图:
     
    贴代码:

      1 //=============================================================
      2 // 包含头文件
      3 //=============================================================
      4 #include <gl/glew.h>    // opengl 扩展封装头文件
      5 #include <gl/glut.h>    // opengl 实用工具头文件
      6 
      7 //=============================================================
      8 // 导入lib
      9 //=============================================================
     10 #pragma comment(lib, "glew32.lib")
     11 
     12 //=============================================================
     13 // 函数声明
     14 //=============================================================
     15 void Initialize();        // 初始化应用程序
     16 void Uninitialize();    // 清理应用程序
     17 
     18 void DrawFunc();                                    // glut描绘回调函数
     19 void ReshapeFunc(int width, int height);            // glut窗口重置回调函数
     20 void KeyboardFunc(unsigned char key, int x, int y);    // glut键盘回调函数
     21 void MouseFunc(int button, int state, int x, int y);// glut鼠标按下与释放回调函数
     22 void MotionFunc(int x, int y);                        // glut鼠标移动回调函数
     23 void IdleFunc();                                    // glut空闲处理回调函数
     24 
     25 void DrawText(const char* text, float x, float y);    // 在屏幕上显示文本
     26 
     27 //=============================================================
     28 // 全局变量
     29 //=============================================================
     30 const static float EPSILON = 0.000001f;
     31 const static float PI = 3.1415926f;
     32 const static float PI_2 = 6.2831852f;
     33 
     34 // 窗口相关
     35 const static int g_WindowPosX = 240;
     36 const static int g_WindowPosY = 200;
     37 int g_WindowWidth = 512;
     38 int g_WindowHeight = 384;
     39 const char* g_WindowTitle = "OpenGL 飘飘白云(www.cnblogs.com/kesalin)";
     40 
     41 // 显示模式:双缓冲,RGBA,深度缓存
     42 const static int g_DisplayMode = (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);    // GLUT_STENCIL GLUT_ACCUM
     43 const static float g_fov = 60.0f;
     44 
     45 float g_rotateY = 0.0f;        // 绕Y轴旋转变量
     46 float g_posX = 0.0f;
     47 
     48 //=============================================================
     49 // main 函数
     50 //=============================================================
     51 int main(int argc, char** argv)
     52 {
     53     // 初始化opengl, glut, glew
     54     glutInit(&argc, argv);
     55     glutInitDisplayMode(g_DisplayMode);   
     56     glewInit();
     57 
     58     // 创建window
     59     glutInitWindowPosition(g_WindowPosX, g_WindowPosY);
     60     glutInitWindowSize(g_WindowWidth, g_WindowHeight);
     61     glutCreateWindow(g_WindowTitle);
     62     
     63     // 初始化应用程序
     64     Initialize() ;
     65     
     66     // 设定glut回调函数
     67     glutDisplayFunc(DrawFunc);
     68     glutReshapeFunc(ReshapeFunc);
     69     glutKeyboardFunc(KeyboardFunc);
     70     glutIdleFunc(IdleFunc);
     71 
     72     // 进入glut事件处理循环
     73     glutMainLoop();
     74 
     75     // 清理应用程序
     76     Uninitialize();
     77     
     78     return 0;
     79 }
     80 
     81 //=============================================================
     82 // 函数定义
     83 //=============================================================
     84 
     85 // 在屏幕上显示文本,x 和 y 为屏幕坐标
     86 void DrawText(const char* text, float x, float y)
     87 {
     88     // 检查OpenGL状态
     89     bool isDepthOpen = false;
     90     bool isStencilOpen = false;
     91     bool isLightOpen = false;
     92     bool isFogOpen = false;
     93     
     94     if(glIsEnabled(GL_DEPTH_TEST)) 
     95     {
     96         isDepthOpen = true;
     97         glDisable(GL_DEPTH_TEST);
     98     }
     99     if(glIsEnabled(GL_STENCIL_TEST))
    100     {
    101         isStencilOpen = true;
    102         glDisable(GL_STENCIL_TEST);
    103     }
    104     if(glIsEnabled(GL_LIGHTING)) 
    105     {
    106         isLightOpen = true;
    107         glDisable(GL_LIGHTING);
    108     }
    109     if(glIsEnabled(GL_FOG))
    110     {
    111         isFogOpen = true;
    112         glDisable(GL_FOG);
    113     }
    114     
    115     int font = (int)GLUT_BITMAP_8_BY_13;
    116 
    117     // 设置字体颜色
    118     glColor3f(1.01.00.0);
    119     
    120     /*
    121      * 设置正投影
    122      */
    123 
    124     glMatrixMode(GL_PROJECTION);
    125 
    126     // 保存当前投影矩阵
    127     glPushMatrix();
    128 
    129         glLoadIdentity();
    130         gluOrtho2D( 0, g_WindowWidth, 0, g_WindowHeight );
    131 
    132         // 反转Y轴(朝下为正方向)(与窗口坐标一致)
    133         glScalef(1-11);
    134         // 将原点移动到屏幕左上方(与窗口坐标一致)
    135         glTranslatef(0-g_WindowHeight, 0);
    136         glMatrixMode(GL_MODELVIEW);
    137         
    138         // 保存当前模型视图矩阵
    139         glPushMatrix();
    140             glLoadIdentity();
    141             
    142             // 设置文字位置
    143             glRasterPos2f( x, y );
    144             
    145             // 依次描绘所有字符(使用显示列表)
    146             for(const char* c = text; *!= '\0'; c++)
    147             {
    148                 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *c);
    149             }
    150 
    151         // 恢复之前保存的模型视图矩阵
    152         glPopMatrix();
    153         
    154         glMatrixMode(GL_PROJECTION);
    155     
    156     // 恢复之前保存的投影矩阵
    157     glPopMatrix();
    158 
    159     // 返回模型视图矩阵状态
    160     glMatrixMode(GL_MODELVIEW);
    161     
    162     // 恢复OpenGL状态
    163     if(isDepthOpen) 
    164     {
    165         glEnable(GL_DEPTH_TEST);
    166     }
    167     if(isStencilOpen)
    168     {
    169         glEnable(GL_STENCIL_TEST);
    170     }
    171     if(isLightOpen) 
    172     {
    173         glEnable(GL_LIGHTING);
    174     }
    175     if(isFogOpen)
    176     {
    177         glEnable(GL_FOG);
    178     }
    179 }
    180 
    181 // 初始化应用程序
    182 void Initialize()
    183 {
    184     // 设置清屏颜色
    185     glClearColor (0.00.00.00.0);
    186 
    187     glShadeModel(GL_SMOOTH);
    188     glEnable(GL_DEPTH_TEST);
    189     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    190 
    191     // 设置视口,投影信息
    192     glMatrixMode(GL_PROJECTION);
    193     glLoadIdentity();
    194     gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.030.0);
    195 }
    196 
    197 // 清理应用程序
    198 void Uninitialize()
    199 {
    200     // nothing
    201 }
    202 
    203 // 空闲处理
    204 void IdleFunc()
    205 {
    206     g_rotateY += 0.2f;
    207 
    208     // 请求重绘
    209     glutPostRedisplay();
    210 }
    211 
    212 // 描绘函数
    213 void DrawFunc()
    214 {
    215     // 清屏
    216     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    217 
    218     glPushMatrix();
    219         glTranslatef(g_posX, 0.0f-5.0f);
    220 
    221         // 描绘圆环
    222         glPushMatrix();
    223             glColor3f (0.0f0.0f1.0f);
    224             glRotatef(g_rotateY, 0.0f1.0f0.0f);
    225             glutSolidTorus(0.2f ,1.0f2040);
    226         glPopMatrix();
    227 
    228         // 描绘矩形
    229         glPushMatrix();
    230             glColor3f (0.0f1.0f1.0f);
    231             glBegin(GL_QUADS);
    232                 glVertex3f (2.0f-1.5f2.0f);
    233                 glVertex3f (-2.0f-1.5f2.0);
    234                 glVertex3f (-2.0f-1.5f-2.0);
    235                 glVertex3f (2.0f-1.50f-2.0);
    236             glEnd();
    237         glPopMatrix();
    238 
    239     glPopMatrix();
    240 
    241     // 显示文本信息
    242     float x = 10.0f;
    243     float y = 20.0f;
    244     DrawText("Author: kesalin@gmail.com", x, y);
    245     DrawText("Push \'A\' or \'D\' to move the torus.", x, y + 20.0f);
    246 
    247     // 交换显示缓冲区
    248     glutSwapBuffers() ;
    249 }
    250 
    251 // 响应窗口重置事件
    252 void ReshapeFunc(int width, int height)
    253 {
    254     g_WindowWidth = width;
    255     g_WindowHeight = height;
    256 
    257     glViewport(00, g_WindowWidth, g_WindowHeight);
    258     glMatrixMode(GL_PROJECTION);
    259     glLoadIdentity();
    260     gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.030.0);
    261 
    262     glMatrixMode(GL_MODELVIEW);
    263     glLoadIdentity();
    264 }
    265 
    266 // 响应按键事件
    267 void KeyboardFunc(unsigned char key, int x, int y)
    268 {
    269     switch (key)
    270     {
    271         case 'A':
    272         case 'a':
    273             // 向左移动
    274             g_posX -= 0.05f;
    275             if( g_posX < -4.0f )
    276             {
    277                 g_posX = -4.0f;
    278             }
    279             break;
    280 
    281         case 'D':
    282         case 'd':
    283             // 向右移动
    284             g_posX += 0.05f;
    285             if( g_posX > 4.0f )
    286             {
    287                 g_posX = 4.0f;
    288             }
    289             break;
    290 
    291         default:
    292             break;
    293     }
    294 }
    295 
    296 // 响应鼠标按下与释放事件
    297 void MouseFunc(int button, int state, int x, int y)
    298 {
    299 #if 0
    300     switch( button )
    301     {
    302         case GLUT_LEFT_BUTTON:
    303         {
    304             if( state == GLUT_UP )
    305             {
    306             }
    307             else if( state == GLUT_DOWN )
    308             {
    309             }
    310         }
    311         break;
    312 
    313         case GLUT_RIGHT_BUTTON:
    314         {
    315             if( state == GLUT_UP )
    316             {
    317             }
    318             else if( state == GLUT_DOWN )
    319             {
    320             }
    321         }
    322         break;
    323     
    324         case GLUT_MIDDLE_BUTTON:
    325         {
    326             if( state == GLUT_UP )
    327             {
    328             }
    329             else if( state == GLUT_DOWN )
    330             {
    331             }
    332         }
    333         break;
    334     }
    335 #endif
    336 }
    337 
    338 // 响应鼠标移动事件
    339 void MotionFunc(int x, int y)
    340 {
    341     // nothing
    342 }
    343 
  • 相关阅读:
    attr系列保留方法使用
    利用python的标准库hashlib 的md5()生成唯一的id
    【病因】 神经衰弱的几大病因
    群里看到的一个骗子批八字的例子
    i'll make a man out of you
    It's A Good Day To Die
    两天了。照着SVN的界面画的一个界面。
    起一卦,看看我想要的,依然这么倒霉
    倒霉倒霉真倒霉,这一卦起得和上一卦一样
    只要是倒霉,起卦就能看出来
  • 原文地址:https://www.cnblogs.com/kesalin/p/glut_demo.html
Copyright © 2011-2022 走看看