(這里需要先完成demo5)
深度緩沖(Depth buffer)
深度緩沖
扯再,也被叫做Z-緩沖
持际,是用來存儲圖形所有片段的深度信息开镣,在進(jìn)行3D圖形的繪制時(shí),每當(dāng)計(jì)算一個圖形片段荚藻,GLEW便會自動生成一個深度
作為這個片段的Z值(深度)
呻右,而當(dāng)這個片段將要被渲染時(shí),OpenGL會將這個片段的深度與Z-深度
進(jìn)行比較鞋喇,通過比較声滥,如果這個片段在其他片段的后面,那么這個片段將會被丟棄,不再渲染落塑,也就不會再出現(xiàn)在屏幕上纽疟,反之,則渲染在屏幕上憾赁。
上述的這個過程稱之為深度測試(Depth Testing)
(話說外國人的取名思路真是新奇 0.0)
深度測試(Depth Testing)
? 在OpenGL中污朽,深度測試
是默認(rèn)關(guān)閉的(即在上下文
中深度測試
是關(guān)閉的屬性),如果想要使用深度測試的功能龙考,需要瘦瘦去打開它
glEnable(GL_DEPTH_TEST);
? 也正因?yàn)殚_啟了深度測試蟆肆,所以在重新渲染其他圖形之前,我們需要清空深度緩沖區(qū)
中間的數(shù)據(jù)晦款,不然后續(xù)的深度測試
會有影響.
glClear(GL_DEPTH_BUFFER_BIT);
深度緩沖區(qū)
中的每一個緩沖都是有有精度的炎功,通常,深度緩沖
的精度以16缓溅、24蛇损、32位的float形式進(jìn)行存儲,一般情況下坛怪,都是以24位的精度進(jìn)行存儲的淤齐。在早期的游戲中,是以16位的精度進(jìn)行存儲的袜匿,這樣會產(chǎn)生一個問題更啄,當(dāng)畫面數(shù)據(jù)過于龐大時(shí),深度緩沖區(qū)
中的緩存值會存在相同的數(shù)據(jù)(數(shù)據(jù)特別大的時(shí)候)居灯,這時(shí)候OpenGL就不再能分辨正面
和背面
祭务,而產(chǎn)生類似于穿模
的狀況,這時(shí)候提升精度就解決這個問題了穆壕。
? 但是并不是精度越高就越好待牵,精度越高其屏,單個深度緩沖占據(jù)的空間就越大喇勋,處理起來就越復(fù)雜,對配置的要求就越高
深度測試函數(shù)
(在深度測試啟用時(shí)偎行,深度測試函數(shù)才會起效果川背。)
OpenGL在進(jìn)行深度測試
時(shí),會通過特定的深度測試函數(shù)
來進(jìn)行數(shù)據(jù)的運(yùn)算并更新深度緩沖
蛤袒,我們可以調(diào)用glDepthFunc
函數(shù)來設(shè)置比較運(yùn)算符(或者說深度函數(shù)(Depth Function)
)
//GL_ALWAYS 深度函數(shù)
glDepthFunc(GL_ALWAYS);
深度函數(shù)
可以改為下表中的函數(shù)(實(shí)際上每個深度函數(shù)都是一系列的計(jì)函數(shù)計(jì)算)
深度值精度
深度緩沖
是由一系列0.0-1.0的深度值所構(gòu)成的熄云,這個值可以是投影平截頭體的近平面(Near)和遠(yuǎn)平面(Far)之間的任何值,通過片段自身的z坐標(biāo)與near和far妙真,可以粗略的計(jì)算出這個片段的深度值
,基于OpenGL缴允,這個值位于0.0-1.0之間,,這里的near和far是之前設(shè)置投影矩陣的時(shí)候設(shè)置的。
但是這個公式是線性的练般,實(shí)際上幾乎永遠(yuǎn)不會使用這樣的數(shù)學(xué)模型矗漾,因?yàn)槲覀冃枰氖牵趜離的很近的時(shí)候要提供足夠的精度以供OpenGL渲染視圖薄料,在z離的很遠(yuǎn)的時(shí)候只需要很小的精度用于判斷是否需要抹去敞贡,也就是需要設(shè)置為 的數(shù)學(xué)模型,因此摄职,可以考慮將深度值
的計(jì)算模型替換為 誊役,這樣就能夠滿足我們的條件了。
深度沖突
深度沖突(Z-fighting)
是指兩個平面或三角形很緊密的平行排列在一起時(shí)(理解為重合吧)谷市,深度精度不足以去判斷它們的深度蛔垢,所以深度測試并不能判斷哪個應(yīng)該顯示,哪個應(yīng)該抹去歌懒,所表現(xiàn)出來的結(jié)果是啦桌,兩個片段不斷的重復(fù)交替出現(xiàn)消失(玩CS的小伙伴應(yīng)該遇到過很多次了),這種現(xiàn)象并不能夠完全的避免及皂,就算是提高了精度值甫男,在數(shù)據(jù)量足夠龐大的時(shí)候依然有可能會出現(xiàn)這樣的問題(就算1080的不夠,還有2K验烧,4K板驳,甚至未來的8K,16K的游戲呢 =碍拆。=),對于這種情況若治,有一些技巧可以防止其產(chǎn)生。
- 在放置物體時(shí)感混,不要講物體放置的太靠近
- 適量的去調(diào)整近平面的位置
- 使用更更高的精度(但會對性能產(chǎn)生影響端幼,畢竟計(jì)算的開銷更大)
基本上,將上面的三種方式結(jié)合起來使用弧满,也能夠解決目前的深度沖突
問題了婆跑,以后技術(shù)更新了,自然會有其他的方式來解決這個問題~