一产捞、正常渲染會(huì)出現(xiàn)的問(wèn)題
默認(rèn)情況下乞旦,OpenGL 將逆時(shí)針?向環(huán)繞繪制的的三角形定義為正?贼穆,反之為背面。當(dāng)我們需要渲染一個(gè)圖案到屏幕上時(shí)兰粉,圖案中的每個(gè)點(diǎn)故痊、線或三角形都會(huì)在屏幕上進(jìn)行光柵化,并按照?qǐng)D元裝配時(shí)的順序進(jìn)行排列玖姑。
如上圖愕秫,當(dāng)我們繪制一個(gè)由多個(gè)三角形組成的復(fù)雜圖形時(shí),由于每個(gè)三角形都有自己的繪制順序(正背面之分)焰络,所以移動(dòng)圖案時(shí)就會(huì)出現(xiàn)部分背面的三角形會(huì)顯示出來(lái)戴甩,也就是圖中黑色部分。那么如何解決這一問(wèn)題呢:
二闪彼、正背面剔除
油畫算法:繪制遵循嚴(yán)格的先后順序甜孤,先遠(yuǎn)后近,近處的圖案會(huì)把遠(yuǎn)處的不應(yīng)展示的部分進(jìn)行遮蓋以解決這一問(wèn)題畏腕。雖然看似完美但也會(huì)有其他問(wèn)題缴川,當(dāng)我們繪制一個(gè)互相層疊覆蓋的圖案時(shí),由于沒(méi)有嚴(yán)格的先后順序郊尝,計(jì)算機(jī)只能進(jìn)行多次繪制二跋,但是多次繪制自然也會(huì)導(dǎo)致性能的浪費(fèi)。
正背面剔除:通過(guò)圖元裝配階段的方向進(jìn)而區(qū)分正背面流昏,背面的直接被拋棄不渲染扎即,自然就可以解決上述問(wèn)題了(省略背面渲染流程還可以起到節(jié)省性能消耗的作用)。
開(kāi)啟背面剔除:glEnable(GL_CULL_FACE);
關(guān)閉背面剔除:glDisable(GL_CULL_FACE);
雖然剔除了不應(yīng)顯示的背面况凉,修復(fù)了黑色的問(wèn)題谚鄙,但如果旋轉(zhuǎn)圖案我們會(huì)發(fā)現(xiàn)如上情況(兩個(gè)正面同時(shí)存在,電腦無(wú)法區(qū)分應(yīng)使用哪個(gè)刁绒,最終導(dǎo)致錯(cuò)拋的情況)闷营。繼續(xù)解決問(wèn)題,請(qǐng)看下文:
三知市、深度測(cè)試
深度:OpenGL坐標(biāo)系中像素點(diǎn)的Z坐標(biāo)距離觀察者的距離傻盟。觀察者可能放在坐標(biāo)系的任何位置,那么嫂丙,就不能簡(jiǎn)單的說(shuō)Z數(shù)值越大或越小娘赴,就是越靠近觀察者。(如果觀察者在Z軸的正方向跟啤,Z值大的靠近觀察者诽表,如果是在Z軸的反方向唉锌,則Z值小的更靠近觀察者。)
深度緩沖區(qū)(DepthBuffer):深度緩沖區(qū)原理就是把一個(gè)距離觀察平面(近裁剪面)的深度值(或距離)與窗口中的每個(gè)像素相關(guān)聯(lián)竿奏。
首先使用glClear(GL_DEPTH_BUFFER_BIT)袄简,把所有像素的深度值設(shè)置為最大值。
啟用了深度緩沖區(qū)泛啸,在繪制每個(gè)像素之前OpenGL都會(huì)把它的深度值和已經(jīng)存儲(chǔ)在這個(gè)像素的深度值進(jìn)行比較绿语。如果新像素深度值<原先像素深度值,則新像素值會(huì)取代原先的像素值候址;反之新像素的顏色值和深度將被丟棄汞舱。這個(gè)比較丟棄的過(guò)程就叫做深度測(cè)試,深度測(cè)試是另一種高效消除隱藏面的技術(shù)宗雇。
申請(qǐng)顏色和深度緩沖區(qū):
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
啟用深度測(cè)試:glEnable(GL_DEPTH_TEST);
關(guān)閉深度測(cè)試:glDisable(GL_DEPTH_TEST);
注意:如果沒(méi)有深度緩沖區(qū),那么啟動(dòng)深度測(cè)試的命令將被忽略莹规。在繪制場(chǎng)景前赔蒲,清除顏色緩沖區(qū)和深度緩沖區(qū):
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
四、z-fighting(z沖突良漱、閃爍)問(wèn)題
當(dāng)深度值精確度較低舞虱,像素點(diǎn)所處深度距離較接近,界面前后圖案交替顯示的情況母市。
那么如何解決這一問(wèn)題呢:
1矾兜、插入偏移量(第二個(gè)像素點(diǎn)繪制時(shí)深度增加偏移量與之前深度形成較大區(qū)分)
2、使用?glPolygonOffset?函數(shù)調(diào)節(jié)片段的深度值
3患久、硬件層面解決椅寺,采用更高性能設(shè)備以使用更高位的深度緩存區(qū)使精確度得到提高(通常使用的深度緩沖區(qū)是24位的,現(xiàn)在有一些硬件使用32位的緩沖區(qū))