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