glutSwapBuffers函数用法

文章来源:http://baike.baidu.com/link?url=F-0esBBzkOr-JXsCG8pqUCD84ZQHWzCMbSHPTYsdtHkvZuUVGIoKmZJk6Hf9dGIwCoxqMb-5NciZ5qILzHKr2a

1函数简介编辑

glutSwapBuffers函数是 OpenGLGLUT工具包中用于实现 双缓冲技术的一个重要函数。该函数的功能是交换两个缓冲区 指针
通常, 我们所看到的窗体、文字、图像,从根本上来说都是“画”出来的。比如,制作一个简单的五子棋, 我们可能先要绘制棋盘,然后绘制棋子,我们可能还要绘制一些提示信息。虽然这些绘制操作有一定的先后顺序,通常情况下,操作系统的这些绘制速度非常的快,使人眼误认为这些绘制操作是同时完成的。
但当我们进行复杂的绘图操作时,画面便可能有明显的闪烁。解决这个问题的关键在于使绘制的东西同时出现在 屏幕上。所谓 双缓冲技术, 是指使用两个缓冲区: 前台缓冲和后台缓冲。前台缓冲即我们看到的屏幕,后台缓冲则在内存当中,对我们来说是不可见的。每次的所有绘图操作都在后台缓冲中进行, 当绘制完成时, 把绘制的最终结果复制到 屏幕上, 这样, 我们看到所有GDI元素同时出现在屏幕上,从而解决了频繁刷新导致的画面闪烁问题。
在OpenGL中实现 双缓冲技术的一种简单方法:
1.在调用 glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);。这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用 双缓冲而非单缓冲。
2. 调用 glutDisplayFunc(display)注册 回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。
3. 调用 glutIdleFunc注册一个空闲时绘制操作函数, 注册的这个函数再调用display函数。

2程序示例编辑

#include <windows.h>
#include <GL/glut.h>
int day = 200; // 0~360
void display(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200, 200, 0, 0, 0, 0, 0, 1);
glColor3f(1.0f, 0.0f, 0.0f);
glutWireSphere(35, 30, 30);
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day / 360.0 * 360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(120, 0.0f, 0.0f);
glutWireSphere(15, 25, 25);
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day / 30.0 * 360.0 - day / 360.0 * 360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(32, 0.0f, 0.0f);
glutWireSphere(10, 10, 10);
glFlush();
glutSwapBuffers();
}
void idle(void)
{
++day;
if( day >= 360 ) {
day = 0;
}
display();
Sleep(20);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 500);
glutCreateWindow("12");
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
词条标签:

计算机学


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值