OpenGL入門(七)-- 圖形圖像渲染中的深度緩沖區

今天我們來聊聊一個很重要的概念--深度緩沖區,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 紋理簡單介紹

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375