概述
在渲染管線中的頂點變換中,介紹了頂點在各個坐標(biāo)空間的變換。變換到最后,是屏幕坐標(biāo)空間。在OpenGL中,屏幕空間坐標(biāo)的Z值即是深度緩沖中的深度值。深度緩沖包含了一個介于0.0和1.0之間的深度值,它將會與觀察者視角所看見的場景中所有物體的z值進行比較。本文將介紹深度值的計算,以及從深度值反向計算出相機空間中的頂點的Z值。
深度值計算
在渲染管線中的頂點變換中,計算得到了透視投影矩陣:
同時,也得到了視口變換矩陣:
首先,根據(jù)透視矩陣,計算NDC空間的Z值。這里,相機空間中的坐標(biāo)經(jīng)過透視矩陣變換后,還要進行齊次除法,才能得到NDC空間中的坐標(biāo)。
由此,可以得出:
根據(jù)上述公式,可以得出:
根據(jù)視口變換矩陣,可以得出:
將帶入
,可以得到:
即:
到這一步,即可以求得屏幕空間中的深度。
在Learn OpenGL CN學(xué)習(xí)過的,可能對深度測試這一節(jié)的內(nèi)容有些印象。它得到的深度值的公式是:
跟式對比,發(fā)現(xiàn)有些不一樣,這是怎么回事呢?
這里要注意,本文定義的、
和
是實際的坐標(biāo)值,是負的。而深度測試文中,定義的
、
代表了近平面和遠平面,而
代表了近、遠平面之間的值,它們都是正的。將
、
、
代入
式,可得:
深度值的線性可視化
經(jīng)過上面的推導(dǎo),我們得出了深度值的計算公式。
現(xiàn)在,反過來,我們知道了屏幕空間中的深度值,怎么求出相機空間中的深度值呢?
首先,根據(jù),可以推導(dǎo)出:
對于公式2,得出的是實際坐標(biāo)的值。為了和OpenGL中的定義統(tǒng)一,也將
、
和
代入公式
,可以得到:
在深度測試這一節(jié)中,得出的公式是:
對比發(fā)現(xiàn),跟公式有些不一樣。這是因為,
求出的是頂點距離相機的距離,是正值。而
是頂點的實際坐標(biāo),是負值,將
取反,即可得到
。
至此,推導(dǎo)完成。
參考
- [1] 深度測試
- [2] 渲染管線中的頂點變換