深度緩沖
發(fā)展
即使深度緩沖區(qū)有足夠大的分辨率,但是如果z緩沖區(qū)中距離精度不隨距離均勻分布的話圖像質(zhì)量也可能會(huì)出現(xiàn)問題。距離較近的部分通常精度較高,這樣近距離的物體顯示質(zhì)量也較高。通常這是所期望得到的結(jié)果,但是當(dāng)物體距離變得較遠(yuǎn)時(shí)可能會(huì)出現(xiàn)人為誤差。一種能夠得到更加均勻分布精度的深度緩沖變體是w緩沖。
在場(chǎng)景開始的時(shí)候,必須將深度緩沖區(qū)初始化為一個(gè)特定的值,通常初始化為1.0,這是因?yàn)?.0是深度范圍0到1的上限,它意味著在整個(gè)視體(viewing frustum)之內(nèi)沒有任何物體。
通常認(rèn)為深度緩沖概念的發(fā)明主要?dú)w功于艾德文·卡特姆,雖然Wolfgang Stra?er也在1974年所寫的博士論文中提到了同樣的思想。
在最近幾年的PC圖形卡上,深度緩沖管理需要使用大量的內(nèi)存帶寬。人們采用了各種各樣的方法減少深度緩沖的影響,其中的方法有無損數(shù)據(jù)壓縮(因?yàn)閴嚎s/解壓所消耗的計(jì)算機(jī)資源要比帶寬的占用更加合算)。另外還使用了極快的硬件工具清除深度信息,這種方法完全取代了“一幀正、一幀負(fù)”這種利用有符號(hào)數(shù)巧妙地繞過幀間深度信息清除的技巧。
z消隱
在渲染過程中,z消隱是根據(jù)深度信息對(duì)像素的早期剔除。當(dāng)渲染隱藏表面所需要的計(jì)算量很大的時(shí)候,這種方法可以提升處理性能。z消隱是深度緩沖的一個(gè)直接結(jié)果,在這種方法中每個(gè)待定像素的深度都要與相同位置的現(xiàn)存像素的深度進(jìn)行比較。
使用深度緩沖區(qū),一旦像素的深度已經(jīng)確定,那么就可以對(duì)這個(gè)像素進(jìn)行裁剪,這樣如果該像素不可見的話就可以完全跳過照明與紋理處理的過程,并且需要消耗許多時(shí)間的像素濃淡工具通常也會(huì)跳過對(duì)于裁剪掉的像素的處理。這樣z消隱就成為了在填充速度、光照、紋理或者像素濃淡處理是主要瓶頸的場(chǎng)合的一種很好的優(yōu)化工具。
盡管深度緩沖可以處理未經(jīng)排序的幾何體,但是按照深度不斷增加的方式(與畫家算法排序方式相反)對(duì)多邊形進(jìn)行排序,每個(gè)像素就可以只渲染一次。對(duì)于填充速度有限但是有大量重復(fù)繪制場(chǎng)合,這種方法就可以提高處理性能。
數(shù)學(xué)基礎(chǔ)
待渲染的照相機(jī)空間中的深度經(jīng)常定義為近距near到遠(yuǎn)距far之間的z值,在透視變換之后,得到新的z"值:
z′=far+nearfar? ? -->near+1z(? ? -->2? ? -->far? ? -->nearfar? ? -->near){\displaystyle z"={\frac {{\mathit {far}}+{\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}}+{\frac {1}{z}}({\frac {-2\cdot {\mathit {far}}\cdot {\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}})}
其中z{\displaystyle z}是照相機(jī)空間的值,它有時(shí)候也表示為w或者w"。
結(jié)果z"是在 -1到1之間歸一化之后的值,其中近距near平面位于 -1處,遠(yuǎn)距far平面位于1處。在這個(gè)范圍之外的相應(yīng)點(diǎn)在視圖體之外,不需要進(jìn)行渲染。
為了實(shí)現(xiàn)深度緩沖,在整個(gè)屏幕空間上的對(duì)當(dāng)前多邊形頂點(diǎn)之間進(jìn)行插值來計(jì)算z"的值,通常這些中間數(shù)值在深度緩沖區(qū)中用定點(diǎn)數(shù)格式保存。距離近距near平面越近,z"值越密;距離越遠(yuǎn),z"值越稀。這樣距離照相機(jī)越近精度越高。near平面距離照相機(jī)越近,則遠(yuǎn)距離位置的精度越低。near平面距離照相機(jī)太近是在遠(yuǎn)距離物體產(chǎn)生人為誤差的一個(gè)常見因素。
w緩沖
為了實(shí)現(xiàn)w緩沖,通常照相機(jī)空間中的z值或者w值都保存成浮點(diǎn)數(shù)格式,但是這些數(shù)值無法根據(jù)頂點(diǎn)在整個(gè)屏幕上進(jìn)行線性插值——通常對(duì)它的倒數(shù)進(jìn)行插值,然后再取倒數(shù)。這樣得到的結(jié)果w值與z"不同,它們?cè)趎ear平面與far平面之間均勻分布。
根據(jù)應(yīng)用的不同z緩沖與w緩沖生成的圖像質(zhì)量也有所不同。
Javascript
當(dāng)在JavaScript中使用標(biāo)簽的時(shí)候,可以將下面的程序作為深度緩沖的公式。
參見
艾德文·卡特姆-- 深度緩沖概念的發(fā)明人
三維計(jì)算機(jī)圖形
不規(guī)則深度緩沖
Z-order
Notes
Note 1: see W.K. Giloi, J.L. Encarna??o, W. Stra?er. "The Giloi’s School of Computer Graphics". Computer Graphics 35 4:12–16.
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價(jià)值
- 一般般
- 沒價(jià)值
{{item.userName}} 舉報(bào)
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評(píng)論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報(bào)
{{_reply.time}}