為了在二維屏幕上繪圖档泽,z緩沖區(qū)必須是二維的故河。
將二維緩沖區(qū)轉(zhuǎn)換為一維
其中辽旋,x和y也可以通過上式變換計算出——
唯一的困難是如何計算我們想要繪制的像素的z值珠增。
一個比較好的想法是采用三角形柵格化的重心坐標版本谷遂,對于想要繪制的每個像素葬馋,簡單地將其重心坐標乘以我們柵格化后的三角形頂點的z值。
三角形的重心坐標版本是這樣——
OpenGL存儲它的所有深度信息于一個Z緩沖(Z-buffer)中肾扰,也被稱為深度緩沖(Depth Buffer)畴嘶。
深度值存儲在每個片段里面(作為片段的z值),當片段想要輸出它的顏色時集晚,OpenGL會將它的深度值和z緩沖進行比較窗悯,如果當前的片段在其它片段之后,它將會被丟棄偷拔,否則將會覆蓋蒋院。這個過程稱為深度測試(Depth Testing)亏钩。
之所以后向面剔除可以使用z-buffer來實現(xiàn),是因為加入z-buffer后欺旧,我們可以判斷一個像素點的z分量的大小姑丑,通過比較大小,我們可以得出辞友,哪些像素點會擋住其他的像素點栅哀,哪些又會被擋住。
我們z-buffer的大小定義為width * height(圖片大小)称龙,這個zbuffer數(shù)組存儲的是(width * height)個像素對應(yīng)的z分量留拾,初值都定義為float型的無窮小。
代碼中的意思是——當前三角形內(nèi)部的P點的z分量如果大于zbuffer[]中該點對應(yīng)的z分量鲫尊,那么就更新zbuffer雨饺,然后畫這個點P苍糠。也就是一個高擋低的實現(xiàn)迁筛。
最后商佑,所有像素點都經(jīng)過這樣處理過后,也就是遍歷完所有的小三角形鸿捧,就完全實現(xiàn)了后向面剔除屹篓。