函式簡介
glutSwapBuffers函式是OpenGL中GLUT工具包中用於實現雙緩衝技術的一個重要函式。該函式的功能是交換兩個緩衝區指針。
通常, 我們所看到的窗體、文字、圖像,從根本上來說都是“畫”出來的。比如,製作一個簡單的五子棋, 我們可能先要繪製棋盤,然後繪製棋子,我們可能還要繪製一些提示信息。雖然這些繪製操作有一定的先後順序,通常情況下,作業系統的這些繪製速度非常的快,使人眼誤認為這些繪製操作是同時完成的。
但當我們進行複雜的繪圖操作時,畫面便可能有明顯的閃爍。解決這個問題的關鍵在於使繪製的東西同時出現在螢幕上。所謂雙緩衝技術, 是指使用兩個緩衝區: 前台緩衝和後台緩衝。前台緩衝即我們看到的螢幕,後台緩衝則在記憶體當中,對我們來說是不可見的。每次的所有繪圖操作都在後台緩衝中進行, 當繪製完成時, 把繪製的最終結果複製到螢幕上, 這樣, 我們看到所有GDI元素同時出現在螢幕上,從而解決了頻繁刷新導致的畫面閃爍問題。
在OpenGL中實現雙緩衝技術的一種簡單方法:
1.在調用glutInitDisplayMode函式時, 開啟GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);。這裡將我們慣用的GLUT_SINGLE替換為GLUT_DOUBLE,意為要使用雙緩衝而非單緩衝。
2. 調用glutDisplayFunc(display)註冊回調函式時, 在回調函式中所有繪製操作完成後調用glutSwapBuffers()交換兩個緩衝區指針。
3. 調用glutIdleFunc註冊一個空閒時繪製操作函式, 註冊的這個函式再調用display函式。
程式示例
#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;
}