Opengl 單雙緩衝區區別

轉自http://blog.csdn.net/mfcappwizard/article/details/6965617
單緩衝,實際上就是將所有的繪圖指令在窗口上執行,就是直接在窗口上繪圖,這樣的繪圖效率是比較慢的,如果使用單緩衝,而電腦比較慢,你回到屏幕的閃爍。
雙緩衝,實際上的繪圖指令是在一個緩衝區完成,這裏的繪圖非常的快,在繪圖指令完成之後,再通過交換指令把完成的圖形立即顯示在屏幕上,這就避免了出現繪圖的不完整,同時效率很高。
一般用OpenGL繪圖都是用雙緩衝,單緩衝一般只用於顯示單獨的一副非動態的圖像


首先是大家可能已經發現,在我們之前提到的所有例子中,在圖形的旋轉過程中整個圖形都有一定程度的閃爍現象,顯得圖形的過渡極不平滑,這當然不是我們所要的效果,幸好opengl 支 持一個稱爲雙緩存的技術,可以有效的幫助我們解決這個問題。我們知道在我們電腦中,屏幕中顯示的東西都會被放在一個稱爲顯示緩存的地方,在通常情況下我們 只有一個這樣的緩衝區,也就是單緩衝,在單緩衝中任何繪圖的過程都會被顯示在屏幕中,這也就是我們爲什麼會看到閃爍,而所謂雙緩衝就是再這個顯示的緩衝區 之外 再建立一個不顯示的緩衝區,我們所有的繪圖都將在這個不顯示的緩衝區中進行,只有當一幀都繪製完了之後纔會被拷貝到真正的現實緩衝區顯示出來,這樣中間過程對於最終用戶就是不可見的了,那即使是速度比較慢也只會出現停頓而不會有閃爍的現象出現。

OpenGL 中我們可以通過glut 庫中的函數

void glutSwapBuffers(void) 來實現從非顯示緩衝區到顯示緩衝區的複製

當然在使用雙緩衝之前我們也要在 glutInitDisplayMode 設定參數的時候選擇GLUT_DOUBLE 而不是之前我們用的 GLUT_SINGLE 相信這兩個參數的意思也應該很明白了

在解決了閃爍的問題之後 我們來解決另一個問題 首先我們在窗口中畫兩個交叉的分別位於ZOX ZOY 平面的長方形 並用不同的顏色填充它們,然後讓它們旋轉很快我們發現有個比較嚴重的問題發生了,因爲我們發現opengl顯然沒有空間的位置觀念因爲它根本不能分辨物體的前後關係,當然也不能做出適當的顯示,在opengl中我們使用深度緩衝區來解決這個問題,在這個緩衝區中存放着每個象素深度信息,當有一個新的象素需要顯示的時候,我們可以通過一個被稱爲深度測試的函數來確定它們的先後關係,要使用深度緩衝區有以下幾個步驟:

1. 在函數 glutInitDisplayMode(mode) 中將GLUT_DEPTH置位 表明要使用深度緩衝區

2. 使用函數glEnable(GL_DEPTH_TEST) 打開深度測試函數

void glEnable(GLenum cap);

void glDisable(GLenum cap);

這兩個函數屬於基本狀態管理函數 用來打開和關閉一些常用的功能,常用的參數有以下幾個

GL_BLEND GL_DEPTH_TEST GL_FOG GL_LINE_STIPPLE GL_LIGHTING

3. 是用函數glDepthFunc()來設置深度測試函數

void glDepthFunc(GLenum func)

這裏我們比較常用的深度測試函數有 GL_LESS GL_LEQUAL 兩者的區別在於當深度相同時是顯示新的象素 還是老的象素

4. 使用下面的函數來設置深度緩衝區的值

void glClearDepth(GLclampd depth)

           這裏的參數是背景的深度 一般來說 我們都將背景深度設成最大值1

5.   最後在我們使用glClear(bits) 刷新背景的同時 我們要將GL_DEPTH_BUFFER_BIT置位 表示我們在刷新背景顏色的同時 用刷新背景深度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章