OpenGL--双缓冲
2015-03-17 16:16
162 查看
双缓冲
就是先将图片绘制到后台缓冲区,然后再交换到前台缓冲区显示。为什么要这么做?一种解释是我们的渲染一般是多线程处理,如果直接绘制到屏幕显示,有可能会出现一张图片还只绘制一部分而下一张又来了的情况,使屏幕看上去在抖动的感觉。所以增加一个后台缓冲区,先绘制到后台,然后直接整张完整的图交换到前台,这样就可以流畅的显示了。
注:主要用于动画播放
实例代码
就是先将图片绘制到后台缓冲区,然后再交换到前台缓冲区显示。为什么要这么做?一种解释是我们的渲染一般是多线程处理,如果直接绘制到屏幕显示,有可能会出现一张图片还只绘制一部分而下一张又来了的情况,使屏幕看上去在抖动的感觉。所以增加一个后台缓冲区,先绘制到后台,然后直接整张完整的图交换到前台,这样就可以流畅的显示了。
注:主要用于动画播放
实例代码
#include "GLTools.h" #include "GLShaderManager.h" #ifdef __APPLE__ #include <glut/glut.h> #else #define FREEGLUT_STATIC #endif static GLfloat angle = 0.0; void display() { glClear(GL_COLOR_BUFFER_BIT); /*矩阵堆栈,可以消除上一次的变换对本次变换的影响,一系列像平移,旋转, 缩放等的矩阵变换操作放在它们之间可以简化操作,不然每次改变都要重新 设置矩阵模式*/ glPushMatrix(); glRotatef(angle, 0.0, 0.0, 1.0); //旋转 glColor3f(1.0, 0.0, 0.0); glRectf(-25.0, -25.0, 25.0, 25.0); //绘制矩形 glPopMatrix(); glutSwapBuffers(); //后台缓冲区交换到前台缓冲区显示 } void init() { glClearColor(0.0, 0.0, 0.0, 0.0); /*设置着色模式:GL_FLAT:恒定着色,用某个顶点颜色来渲染整个图元 GL_SMOOTH:光滑着色,独立的处理图元中各个顶点的颜色。*/ glShadeModel(GL_FLAT); } 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); //参数设置的是视景体 if (w <= h)//设置视景体与视口宽高比例一致,这样改变窗口大小,物体也不会变形 glOrtho(-50.0, 50.0, -50.0 * (GLfloat)h/(GLfloat)w, 50.0 * (GLfloat)h/(GLfloat)w, -1.0, 1.0); else glOrtho(-50.0*(GLfloat)w/(GLfloat)h, 50*(GLfloat)w/(GLfloat)h, -50, 50, -1.0, 1.0); //接下来的矩阵操作设置为模型操作,即平移,旋转,缩放等操作 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void spinDisplay() { angle = angle + 2.0; if (angle > 360.0) angle = angle - 360.0; glutPostRedisplay(); //重新绘制窗口 } 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_RIGHT_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } } int main(int argc,char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //显示模式:双缓冲,RGB模式 glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow("double"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); //窗口大小改变调用的回调函数 glutMouseFunc(mouse); //鼠标按钮回调 glutMainLoop(); return 0; }
相关文章推荐
- OpenGL之颜色缓冲区、深度缓冲区、模板缓冲区
- 对opengl模板缓冲原理小感
- OpenGL学习: 帧缓冲对象(Frame Buffer Object)
- OpenGL使用模板模板缓冲时需要注意的几个问题 .
- OpenGL单缓冲与双缓冲的区别
- OpenGL 深度缓冲区 Z缓冲区 介绍
- OpenGL: 深度缓冲区-Z缓冲区
- OpenGL中GL_FRONT_RIGHT、GL_BACK_RIGHT等绘制缓冲的概念
- OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)
- 双缓冲绘图以及OpenGL中的双缓冲支持
- OpenGL单缓冲与双缓冲的区别
- OpenGL 深度缓冲区 Z缓冲区 介绍
- OpenGL VBO顶点缓冲的使用
- opengl的一个简单的双缓冲程序!
- OpenGL VBO顶点缓冲的使用
- OpenGL单缓冲与双缓冲的区别
- D3D或OpenGL GDI+的双缓冲技术
- OpenGL使用模板模板缓冲时需要注意的几个问题
- OpenGL--双缓冲
- OpenGL的消隐与双缓冲