opengl 单缓冲与双缓冲

Posted keguniang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl 单缓冲与双缓冲相关的知识,希望对你有一定的参考价值。

1、说明

GLUT_SINGLE  指定单缓存窗口

GLUT_DOUBLE  指定双缓存窗口

 

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;
}                                        

以上是关于opengl 单缓冲与双缓冲的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL的消隐与双缓冲

单缓冲和双缓冲 有啥区别

OpenGL 片段着色器未写入 fbo 颜色缓冲区

OpenGL GLSL 统一缓冲区对象

◮OpenGL-帧缓冲

◮OpenGL-帧缓冲