1. 程式人生 > >OpenGL單緩衝與雙緩衝的區別

OpenGL單緩衝與雙緩衝的區別

單快取和雙快取

在我們電腦中,螢幕中顯示的東西都會被放在一個稱為顯示快取的地方,在通常情況下我們只有一個這樣的緩衝區即單緩衝,在單緩衝中任何繪圖的過程都會被顯示在螢幕中,這也就是我們為什麼會看到閃爍。而所謂雙緩衝就是再這個顯示的緩衝區之外再建立一個不顯示的緩衝區,我們所有的繪圖都將在這個不顯示的緩衝區中進行,只有當一幀都繪製完了之後才會被拷貝到真正的現實緩衝區顯示出來,這樣中間過程對於終端使用者就是不可見的了,那即使是速度比較慢也只會出現停頓而不會有閃爍的現象出現。

單快取:幀快取區開闢一個螢幕繪圖快取區。
雙快取:幀快取區開闢兩個螢幕繪圖快取區,交替使用,便於動畫繪製 。
可以通過以下方法來設定視窗的展示模式為單緩衝或雙緩衝

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glFlush(); //單緩衝的重新整理模式;
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutSwapBuffers(); //雙緩衝的重新整理模式;

一般用OpenGL繪圖都是用雙緩衝,單緩衝一般只用於顯示單獨的一副非動態的影象。

使用深度測試函式:

在解決了閃爍的問題之後,我們來解決另一個問題:首先我們在視窗中畫兩個交叉的分別位於ZOX 和 ZOY 平面的長方形,並用不同的顏色填充它們,然後讓它們旋轉很快我們發現有個比較嚴重的問題,因為我們發現OpenGL顯然沒有空間的位置觀念

,因為它根本不能分辨物體的前後關係,當然也不能做出適當的顯示。在OpenGL中我們使用深度緩衝區來解決這個問題,在這個緩衝區中存放著每個象素深度資訊,當有一個新的象素需要顯示的時候,我們可以通過一個被稱為深度測試的函式來確定它們的先後關係。

  • 使用 glEnable(GL_DEPTH_TEST)。在預設情況是將需要繪製的新畫素的z值與深度緩衝區中對應位置的z值進行比較,如果比深度快取中的值小,那麼用新畫素的顏色值更新幀快取中對應畫素的顏色值。
  • 但是可以使用glDepthFunc(func)來對這種預設測試方式。其中引數func的值可以為GL_NEVER(沒有處理)、GL_ALWAYS(處理所有)、GL_LESS(小於)、GL_LEQUAL(小於等於)、GL_EQUAL(等於)、GL_GEQUAL(大於等於)、GL_GREATER(大於)GL_NOTEQUAL(不等於),其中預設值是GL_LESS。
  • 一般來講,使用glDepthFunc(GL_LEQUAL);來表達一般物體之間的遮擋關係。
  • 啟用了深度測試,那麼這就不適用於同時繪製不透明物體。