深度緩沖與深度測試的原理

前言
今天給大家分享的是深度緩沖與深度測試的原理,幫助大家對深度緩沖深度測試的理解
在開發(fā)渲染的過程中,我們少不了要進行深度緩沖和深度測試,通過這兩個步驟我們可以更好的進行渲染,做出更加炫麗的效果,首先我們需要了解它們的原理,以更好的使用
版權(quán)聲明
本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明
更多學(xué)習(xí)資源可以私信我獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項目實戰(zhàn)/每周直播/一對一指導(dǎo))
點贊、關(guān)注、分享可免費獲得配套學(xué)習(xí)資源
完整文章合集
深度緩沖與深度測試原理
深度緩沖與深度測試應(yīng)用
畫家算法
如果你想了解計算機如何去繪圖,就需要了解畫家算法,在計算機圖形學(xué)中,有一個很重要的問題需要解決,這個問題叫做可見性問題,我們需要將一個3D模型投影到一個2D的屏幕上,在這個過程中,哪些模型上的三角形是可見的,哪些是不可見的,都需要正確處理

如上圖所示,當一個畫家需要畫出最右側(cè)圖片時,他一定是先從最遠的開始畫起,而圖上從左到右的繪畫順序就是典型的畫家算法
計算機圖形學(xué)就是用畫家算法進行繪圖,首先將待渲染圖形里面的多邊形根據(jù)深度排序,之后按照順序進行繪制,當我們從后往前進行繪制時,就不會造成后面遮擋前面的問題,也就解決了可見性問題
逐個像素點排序
但畫家算法只能解決一些明顯的可見性問題,如下圖所示,當模型進行穿插時,你分辨不出圖形的前后關(guān)系,這時候,就需要逐個像素點排序(即一個一個像素點比較)
為了能夠確定每個像素點的深度(像素點靠攝像機的距離),我們就需要用到深度緩沖

深度緩沖

深度緩沖將上圖像素的深度描繪成不同深淺的紅色,我們可以看到上圖兩幅畫面的對比,紅色越深的像素,代表它離攝像頭越近,也就是它的深度越近
假設(shè)物體A,B,C的深度為5,6,7;初始化深度緩沖區(qū)中數(shù)據(jù)為無窮,如果我們先畫物體A,A的深度為5,此時5<無窮,因此把A物體的顏色值寫入顏色緩沖區(qū)中,同時把5寫入深度緩沖區(qū)中A物體占據(jù)的區(qū)域
A渲染完成,渲染物體B時,如果有區(qū)域重復(fù)的地方,則將A與B的深度比較,因為5<6,因此B的深度不會寫入屏幕當中

當然,因為我們先繪制的物品不同,物品深度存在差異,深度緩沖的方式也不盡相同,繪制效率也會不同,那么是先渲染物體A,B,C的效率高,還是渲染C,B,A的效率高呢?
答案是渲染A,B,C的順序效率高
當我們按照C,B,A的順序進行渲染時,明顯可以看出顏色寫入和深度寫入的次數(shù)遠多于順序A,B,C,并且在我們的手機圖形硬件中,有一個Eerly-Z的機制,它會把深度測試的時機提前,我們不再進行fragment片源著色,然后進行深度比較,而是先進行深度比較,再進行圖形像素點的渲染,因此我們節(jié)省的不僅僅是顏色寫入和深度寫入的時間開銷,而是整個像素的渲染開銷
Unity中的深度
實際上在unity中,并不是用整數(shù)表示的,而是用0~1之間的浮點數(shù)表示的,在傳統(tǒng)的圖形學(xué)中對于無窮遠用1.0表示,而距離攝像機最近的則用0.0表示

為什么要用0.0、1.0表示呢,這跟三維圖形變換有關(guān),我們渲染的物件,是一個一個的3D模型,像圖片左上角的立方體所示,它有本身的坐標空間,通過矩陣變換,將模型放在游戲世界的每一個角,落,如上圖中第3個方框所示,以攝像機視角觀察,得出上圖第二排第一個方框所示,經(jīng)過投影變換后,每一個物體都會經(jīng)過透視替換,都可以看到這些物件,它的深度值對于opengl都是介于[-1,1]之間,對于D3D都是介于[0,1]之間,如何得到值呢?
就是把能在攝像機中看到的景物經(jīng)過坐標變換,而變換矩陣會確保能看到的景物深度值在[0,1]區(qū)間中

圖中near表示離攝像機近的距離,far表示離攝像機遠的距離
我們在靠近攝像機的位置和遠離攝像機的位置各取兩個距離相同的像素點,可以看到它們之間的深度是不同的
可以看出unity中越靠近的物體越精確,距離遠的物體的兩個像素點的深度值差很小,很難看出它的深度值差
