zoukankan      html  css  js  c++  java
  • opengl 单缓冲与双缓冲

    1、说明

    GLUT_SINGLE  指定单缓存窗口

    GLUT_DOUBLE  指定双缓存窗口

     应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。

    2、原理

    GLUT_SINGLE单缓冲,屏幕显示调用glFlush(),将图像在当前显示缓存中直接渲染,会有图形跳动(闪烁)问题

    GLUT_DOUBLE双缓冲,屏幕显示调用glutSwapBuffers(),将图像先绘制在另外的缓存中,渲染完毕之后,将其整个缓存贴到当前的窗口,能消除闪烁,一般动画要用双缓冲.

    如果缓冲与函数不对应的话,则会出错。

    3、GLUT_DOUBLE例子:

    #include <gl/glut.h>
    
    #include <Windows.h>
    
    void myDisplay(void)
    
    {
    
      glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
      glPointSize(20);
    
         glBegin(GL_POINTS);
    
          glColor3f(0.0, 1.0, 0.0);
    
          glVertex2f(0.0, 0.0);
    
         glEnd();
    
      glutSwapBuffers();
    
    }
    
    
    
    int main(int argc, char* argv[])
    
    {
    
      glutInit(&argc, argv);
    
      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    
      glutInitWindowPosition(200, 200);
    
      glutInitWindowSize(400, 400);
    
      glutCreateWindow("OpenGL 窗口1");
    
      glutDisplayFunc(&myDisplay);
    
      glutMainLoop();
    
      return 0;
    
    }

    4、GLUT_SINGLE例子:

    #include <gl/glut.h>
    
    #include <Windows.h>
    
    void display()
    {
      glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glPointSize(20);
      glBegin(GL_POINTS);
          glColor3f(0.0, 1.0, 0.0);
          glVertex2f(0.0, 0.0);
      glEnd();
      glFlush();
    }
    
    int main(int argc, char* argv[])
    {
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
      glutInitWindowPosition(200, 200);
      glutInitWindowSize(400, 400);
      glutCreateWindow("OpenGL 窗口1");
      glutDisplayFunc(display);
      glutMainLoop();
      return 0;
    }                                        
  • 相关阅读:
    easyui的datagrid右侧没有边框线
    移除input在type="number"时的上下箭头
    端口被占用的解决办法
    给DOM操作生成的元素添加事件
    前端工具——Gulp篇
    python类型学习
    python对象学习
    Python之系统交互(subprocess)
    如何准确高效的获取数据库新插入数据的主键id
    接口和抽象类有什么区别
  • 原文地址:https://www.cnblogs.com/keguniang/p/9857321.html
Copyright © 2011-2022 走看看