今天我們來聊聊一個很重要的概念--深度緩沖區,OpenGL中的深度緩沖區,也叫Z緩沖區,接下來我們來大概了解一下。
其他緩沖區簡要介紹
在了解深度緩沖區之前,我們先來聊聊其他相關的一些緩沖區的介紹。
顏色緩沖區
顏色緩沖區(COLOR_BUFFER)就是幀緩沖區(FRAME_BUFFER),你需要渲染的場景最終每一個像素都要寫入該緩沖區,然后由它在渲染到屏幕上顯示。
深度緩沖區
- 深度緩沖區(DEPTH_BUFFER)與幀緩沖區對應,用于記錄上面每個像素的深度值,通過深度緩沖區,我們可以進行深度測試,從而確定像素的遮擋關系,保證渲染正確。
- 作用:深度緩沖區的作用就是區分顏色所在的層次,防止把被遮擋住的顏色顯示出來。
模板緩沖區
模版緩沖(STENCIL_BUFFER)與深度緩沖大小相同,通過設置模版緩沖每個像素的值,我們可以指定在渲染的時候只渲染某些像素,從而可以達到一些特殊的效果。實際開發使用中,我們很少使用到。
深度緩沖區的原理介紹
隱藏面消除
隱藏表面消除就是消除實心物體被其他物體所遮擋的那部分。實現隱藏表面消除最簡單方法就是使用深度緩沖區(又叫Z緩沖區)。
深度緩沖區原理
深度緩沖區原理就是把一個距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個像素相關聯。
- 首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值設置為最大值(一般是遠裁剪面)。
- 然后,在場景中以任意次序繪制所有物體。硬件或者軟件所執行的圖形計算把每一個繪制表面轉換為窗口上一些像素的集合,此時并不考慮是否被其他物體遮擋。
- 其次,OpenGL會計算這些表面和觀察平面的距離。如果啟用了深度緩沖區,在繪制每個像素之前,OpenGL會把它的深度值和已經存儲在這個像素的深度值進行比較。新像素深度值<原先像素深度值,則新像素值會取代原先的;反之,新像素值被遮擋,他顏色值和深度將被丟棄。
為了啟動深度緩沖區,必須先啟動它,即glEnable(GL_DEPTH_TEST)。每次繪制場景之前,需要先清除深度緩沖區,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序繪制場景中的物體。
深度測試
在OpenGL中,經常會出現深度測試,那么什么是深度?為什么需要深度?怎么啟用深度測試?接下來,我們就來把它弄清楚。
什么是深度?
- 深度其實就是該象素點在3d世界中距離攝象機的距離(繪制坐標),深度緩存中存儲著每個象素點(繪制在屏幕上的)的深度值!
- 深度值(Z值)越大,則離攝像機越遠。
- 深度值是存貯在深度緩存里面的,我們用深度緩存的位數來衡量深度緩存的精度。
為什么需要深度?
- 在不使用深度測試的時候,如果我們先繪制一個距離較近的物體,再繪制距離較遠的物體,則距離遠的物體因為后繪制,會把距離近的物體覆蓋掉,這樣的效果并不是我們所希望的。而有了深度緩沖以后,繪制物體的順序就不那么重要了,都能按照遠近(Z值)正常顯示,這很關鍵。
- 實際上,只要存在深度緩沖區,無論是否啟用深度測試,OpenGL在像素被繪制時都會嘗試將深度數據寫入到緩沖區內,除非調用了glDepthMask(GL_FALSE)來禁止寫入。這些深度數據除了用于常規的測試外,還可以有一些有趣的用途,比如繪制陰影等等。
啟用深度測試
- 使用
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)
;來表達一般物體之間的遮擋關系。
注意:啟用了深度測試,那么這就不適用于同時繪制不透明物體。繪制半透明物體時,需注意:在繪制半透明物體時前,還需要利用
glDepthMask(GL_FALSE)
將深度緩沖區設置為只讀形式,否則可能出現畫面錯誤。為什么呢,因為畫透明物體時,將使用混色,這時就不能繼續使用深度模式,而是利用混色函數來進行混合。這一來,就可以使用混合函數繪制半透明物體了。
--
總結:上面我們提到了關于混色函數進行混合處理,我們在后面的學習中會講講關于混合的處理。
--
系列連載
OpenGL入門(一)-- 圖形API簡介與作用
OpenGL入門(二)-- 快速了解OpenGL下的專業名詞
OpenGL入門(三)-- OpenGL坐標系解析與坐標變換
OpenGL入門(四)-- OpenGL坐標系與坐標變換
OpenGL入門(五)-- OpenGL渲染流程圖解析
OpenGL入門(六)-- OpenGL 固定存儲著色器的理解使用
OpenGL入門(七)-- 圖形圖像渲染中的深度緩沖區
OpenGL入門(八)-- OpenGL向量和矩陣簡介
OpenGL入門(九)-- OpenGL 紋理簡單介紹