• OpenGL3:幼儿园篇 第一章 使用FreeGlut


    一.简介

    FreeGlut官网

     FreeGlut是Glut的开源版本

    二.配置FreeGlut

    1.使用cmake

    cmake(cross platform make)是一个跨平台的安装(编译)工具

     

    三.初始化

     1.窗口管理函数

    glutInit(int* argc, char** argv)                  // 窗口初始化

    glutInitDisplayMode(unsigned int mode)             // 窗口属性

    glutInitWindowPosition(int x,int y)                // 窗口位置

    glutInitWindowSize(int width, int size)               // 窗口大小

    glutInitContextVersion(int majorVersion, int minorVersion)     // 窗口版本

    glutInitContextFlags(int flags)                    //

    glutCreateWindow(char* string)                // 创建窗口

    2.事件响应函数

    glutIdleFunc(void(*func) (void))  // 空闲回调函数

    glutDisplayFunc()        // 绘制回调函数

    glutReshapeFunc()       // 重绘回调函数

    glutMouseFunc()        // 鼠标回调函数

    3.消息循环

    glutMainLoop()

    4.绘制函数

    glutSwapBuffers()    // 交换缓存进行重新绘制

    glutPostRedisplay()     // 发送重绘消息

    glutGetProcAddress()

    四.示例

    1.

    #include <GL/freeglut.h>


    //////////////////////////////////////////////////////
    // 渲染场景
    void display(void)
    {
        glutSwapBuffers(); //双缓存
    }

    //////////////////////////////////////////////////////
    // 重绘窗口
    void reshape(int w, int h)
    {
        
    }

    //////////////////////////////////////////////////////
    // 键盘事件
    void keyboard(unsigned char key, int x, int y)
    {
        glutPostRedisplay();  // 发送消息重绘
    }

    //////////////////////////////////////////////////////
    // 主程序入口
    int main(int argc, char** argv)
    {
        // 初始化
        glutInit(&argc, argv);

        // 显示模式(单缓存 | RGB颜色)
        glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);

        // 调整窗口大小和位置
        glutInitWindowPosition(100,100);
        glutInitWindowSize(320,320);

        // 创建窗口
        glutCreateWindow("GLUT");

        // 重绘回调函数
        glutReshapeFunc(reshape);

         // 键盘回调函数
         glutKeyboardFunc(keyboard);

        // 鼠标回调函数
        //glutMotionFunc(mouse);

        // 渲染回调函数
        glutDisplayFunc(display);

        // OpenGL检测
        const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
        const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
        const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
        const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本


        printf("OpenGL实现厂商的名字:%s ", name);
        printf("渲染器标识符:%s ", biaoshifu);
        printf("OpenGL实现的版本号:%s ", OpenGLVersion);
        printf("OGLU工具库版本:%s ", gluVersion);

        // 处理消息循环
        glutMainLoop();

        //system("pause");
        return 0;
    }

    2.

    鼠标按下矩形旋转

    #include <stdio.h>
    #include <GL/freeglut.h>
    
    static GLfloat spin = 0.0;
    
    void init(void)
    {
    	glClearColor(0.0, 0.0, 0.0, 0.0);
    	glShadeModel(GL_FLAT);
    }
    
    void display(void)
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glPushMatrix();
    	glRotatef(spin, 0.0, 0.0, 1.0);
    	glColor3f(1.0, 1.0, 1.0);
    	glRectf(-25.0, -25.0, 25.0, 25.0);
    	glPopMatrix();
    	glutSwapBuffers();
    }
    
    void spinDisplay(void)
    {
    	spin = spin + 2.0;
    	if (spin > 360.0)
    		spin = spin - 360.0;
    	glutPostRedisplay();
    }
    
    // 窗口宽和高 void reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch(button){ case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(spinDisplay); break; case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } } ////////////////////////////////////////////////////// // 主程序入口 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; }
  • 相关阅读:
    解决VS2005 远程工具无法通过同步软件连接S5pv210 样机的问题
    java.util.concurrent 多线程框架线程池编程(三)
    线程池java.util.concurrent 多线程框架(二)
    java.util.concurrent 多线程框架线程池编程(一)
    java.util.concurrent 多线程框架线程池编程(四)
    Box2D学习笔记(2)
    Box2D学习笔记(1)
    ASP.NET页面防止刷新
    C#中跨数据库增删改的事务控制
    .NET(C#)开源代码分析
  • 原文地址:https://www.cnblogs.com/k5bg/p/11170215.html
Copyright © 2020-2023  润新知