第一篇
【顏色緩沖區】
顏色緩沖區(COLOR_BUFFER)就是幀緩沖區(FRAME_BUFFER),你需要渲染的場景最終每一個像素都要寫入該緩沖區,然後由它在渲染到屏幕上顯示.
【深度緩沖區】
深度緩沖區(DEPTH_BUFFER)與幀緩沖區對應,用於記錄上面每個像素的深度值,通過深度緩沖區,我們可以進行深度測試,從而確定像素的遮擋關系,保證渲染正確.
【模板緩沖區】
模版緩沖(STENCIL_BUFFER)與深度緩沖大小相同,通過設置模版緩沖每個像素的值,我們可以指定在渲染的時候只渲染某些像素,從而可以達到一些特殊的效果.
深度緩沖區的作用就是區分顏色所在的層次,防止把被遮擋住的顏色顯示出來。
當一個像素第二次被繪制時– 例如當一個物體在另一個物體之後被繪制- 深度緩沖要麼保留前面的深度值,要麼使用第二個像素的深度值替換當前深度值。那個深度保留哪個深度拋棄取決於你選擇的深度函數。例如,如果當前深度函數是CompareFunction.LessEqual時,只有小於等於當前深度值的值才會被保留,而大於當前深度值的值會被拋棄。這叫做深度測試,每次繪制像素時都會進行深度測試。當對一個像素進行深度測試時,它的顏色會被寫入渲染目標,而深度被寫入深度緩沖
深度緩沖區原理以及為什麼要用它
----------------參考資料《OpenGL編程指南》
OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm
-------------------------------------分割線-------------------------------------
OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm
Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm
OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm
Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm
如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm
《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm
-------------------------------------分割線-------------------------------------
1.在開始介紹深度緩存之前,先了解一下隱藏表面消除。
隱藏表面消除(hidden-surface removal)就是消除實心物體被其他物體所遮擋的那部分。實現隱藏表面消除最簡單方法就是使用深度緩沖區(又叫Z緩沖區)。
2.深度緩沖區原理
深度緩沖區原理就是把一個距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個像素相關聯。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值設置為最大值(一般是遠裁剪面)。
然後,在場景中以任意次序繪制所有物體。硬件或者軟件所執行的圖形計算把每一個繪制表面轉換為窗口上一些像素的集合,此時並不考慮是否被其他物體遮擋。
其次,OpenGL會計算這些表面和觀察平面的距離。如果啟用了深度緩沖區,在繪制每個像素之前,OpenGL會把它的深度值和已經存儲在這個像素的深度值進行比較。新像素深度值<原先像素深度值,則新像素值會取代原先的;反之,新像素值被遮擋,他顏色值和深度將被丟棄。
為了啟動深度緩沖區,必須先啟動它,即glEnable(GL_DEPTH_TEST)。每次繪制場景之前,需要先清除深度緩沖區,即glClear(GL_DEPTH_BUFFER_BIT),然後以任意次序繪制場景中的物體。
第二篇
openGL裡常出現深度測試,一直不清楚。今天就來弄清楚。
(1)什麼是深度?
深度其實就是該象素點在3d世界中距離攝象機的距離(繪制坐標),深度緩存中存儲著每個象素點(繪制在屏幕上的)的深度值!
深度值(Z值)越大,則離攝像機越遠。
深度值是存貯在深度緩存裡面的,我們用深度緩存的位數來衡量深度緩存的精度。深度緩存位數越高,則精確度越高,目前的顯卡一般都可支持16位的Z Buffer,一些高級的顯卡已經可以支持32位的Z Buffer,但一般用24位Z Buffer就已經足夠了。
(2)為什麼需要深度?
在不使用深度測試的時候,如果我們先繪制一個距離較近的物體,再繪制距離較遠的物體,則距離遠的物體因為後繪制,會把距離近的物體覆蓋掉,這樣的效果並不是我們所希望的。而有了深度緩沖以後,繪制物體的順序就不那麼重要了,都能按照遠近(Z值)正常顯示,這很關鍵。
實際上,只要存在深度緩沖區,無論是否啟用深度測試,OpenGL在像素被繪制時都會嘗試將深度數據寫入到緩沖區內,除非調用了glDepthMask(GL_FALSE)來禁止寫入。這些深度數據除了用於常規的測試外,還可以有一些有趣的用途,比如繪制陰影等等。
(2)啟用深度測試
使用 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);來表達一般物體之間的遮擋關系。
(3)啟用了深度測試,那麼這就不適用於同時繪制不透明物體。
備注:
繪制半透明物體時,需注意:在繪制半透明物體時前,還需要利用glDepthMask(GL_FALSE)將深度緩沖區設置為只讀形式,否則可能出現畫面錯誤。為什麼呢,因為畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可以使用混合函數繪制半透明物體了。