• OpenGL中实现双缓冲技术


    在OpenGL中实现双缓冲技术的一种简单方法:
    1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);。这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用双缓冲而非单缓冲。
    2. 调用glutDisplayFunc(display)注册回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。
    3. 调用glutIdleFunc注册一个空闲时绘制操作函数, 注册的这个函数再调用display函数。
     
    #include <GL/glut.h>
    #include <stdlib.h>
    
    static GLfloat spin = 0;
    void init(void)
    {
        glClearColor(0, 0, 0, 0); // 设置清除背景颜色
        glShadeModel(GL_FLAT); //设置着色模式
    }
    
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT); // 用当前缓冲区清除值,
        glPushMatrix();                       //将当前矩阵压入栈
        glRotatef(spin, 0, 0, 1);           //旋转角度
        glColor3f(1, 1, 0);
        glRectf(-25, -25, 25, 25);
        glPopMatrix();
        glutSwapBuffers(); //交换双缓冲区指针
    }
    
    void spinDisplay(void)
    {
        spin = (spin + 2.0) >= 360 ? spin-358 : spin + 2.0;
        glutPostRedisplay();
    }
    
    void spinRightDisplay(void)
    {
        spin = (spin - 2.0) < 0 ?  spin + 360 :  spin -2.0;
        glutPostRedisplay();
    }
    
    void reshape(int w, int h)
    {
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-50, 50, -50, 50, -1, 1);
        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;
        case GLUT_RIGHT_BUTTON:
            if (state == GLUT_DOWN)
            {
                glutIdleFunc(spinRightDisplay);
            }
        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;
    }
     
  • 相关阅读:
    kubernetes 【版本】
    【pod无法删除 总是处于terminate状态】强行删除pod
    prometheus数据格式
    【prometheus 抓取源】
    【PromQL】prometheus查询语言
    【grafana报错】Singlestat "Error: Multiple Series Error"
    【prometheus抓取间隔】scrape_interval
    【分布式一致性】etcd
    【kubectl 原理】kubectl 命令执行的时候究竟发生了什么(kubectl、apiserver、etcd)
    中国移动DNS IP地址大全(32个省)
  • 原文地址:https://www.cnblogs.com/aituming/p/6193209.html
Copyright © 2020-2023  润新知