當我們以某一視角觀察一個多面立體圖形的時候奸披,我們的肉眼只能看到一部分面積,也就是我們的視線正前方的面涮雷,例如觀察一個圓柱體根據(jù)我們觀察角度的不同我們只能看到一個曲面或者一個曲面加一個圓阵面,觀察一個立方體最多也只能看到三個面,所以為了提高渲染性能,我們完全沒有必要去繪制我們看不到的面样刷,在OpenGL中面剔除就可以實現(xiàn)這一需求仑扑。
面剔除(Face Culling)
在OpenGL中開啟面剔除使用
glEnable(GL_CULL_FACE);
使用glFrontFace (GLenum mode);
可以指定剔除模式參數(shù)為GL_CCW
或GL_CW
,GL_CCW
為默認的模式置鼻,即以頂點逆時針連接方向為正面镇饮,以頂點順時針連接方向連接為反面。圖例如下:(圖片來自www.learnopengl.com)箕母。
如上圖立方體距離我們眼睛最近的一個面以頂點1>2>3連接順序為正面储藐,那么后面的那個面為反面。
使用glCullFace (GLenum mode);
可執(zhí)行剔除嘶是,參數(shù)可以是GL_BACK
或 GL_FRONT
或GL_BACK_AND_FRONT
钙勃,分別是背面剔除、正面剔除俊啼、正面反面都剔除肺缕。
面剔除除了可以提升渲染性能,還可以解決圖元在光柵化渲染的時候由于三角形繪制順序出錯而導致圖形的反面覆蓋在圖形的正面上的顯示錯誤授帕。圖例如下:
如上圖所示同木,繪制一個像游泳圈一樣的立體圖形,通過鍵盤來控制圖形旋轉跛十,但是旋轉后我們會發(fā)現(xiàn)圖形出現(xiàn)了一些黑色的條彤路,這種情況就是因為圖形旋轉重新渲染時在光柵化渲染時會把圖元分解為一個個三角形,如果先渲染正面的三角形后渲染反面的三角形芥映,那么三角形重疊的部分就會是反面的三角形覆蓋在了正面的三角形上洲尊,從而出現(xiàn)了我們在上圖看到的那種情況。
通過上圖可以很直觀的看到圖形的反面是黑色的奈偏,并且在上方出現(xiàn)了黑色覆蓋了紅色的情況坞嘀。
所以我們可以通過反面剔除來解決這個問題。
在使用背面剔除的時候可能會出現(xiàn)重疊部分剔除多了的情況(如下圖所示)惊来,這種情況我們可以使用開啟深度測試來解決丽涩。
深度測試(GL_DEPTH_TEST)
在OpenGL中深度指的就是在坐標系中像素Z的值,距離觀察者的距離裁蚁,觀察者可以在任何位置矢渊,OpenGL中會有專門一塊緩存區(qū)來存放Z值--深度緩存區(qū),來存放每個像素上的Z值枉证。
深度緩存區(qū)的作用
一般情況下矮男,我們繪制圖形時,后面繪制的會覆蓋前面的圖形室谚,繪制的順序為先后面后前面毡鉴,這樣就會產(chǎn)生一個性能問題崔泵,先繪制的會被后繪制的覆蓋掉,顯然這是沒有任何意義的眨补,上面介紹過通過剔除法可以剔除背面的圖形管削,從而提高性能,深度測試也可以解決這個問題撑螺,在有了深度緩存區(qū)后,繪制的時候會檢查Z值崎弃,靠近觀察者的覆蓋甘晤,而不是靠繪制順序來決定的。-
如何使用深度緩存區(qū)測試
使用glEnable(GL_DEPTH_TEST);
來開啟深度測試饲做。默認情況下线婚,Z值小的面會被覆蓋。
如果觀察者在Z軸的正方向盆均,Z值大的靠近觀察者
如果觀察者在Z軸的負方向塞弊,Z值小的靠近觀察者 深度測試的弊端
在繪制多邊形并且開啟深度測試時,可能會產(chǎn)生z-stitching和z-fighting泪姨。當使用glPolygonMode (GLenum face, GLenum mode)
為多邊形繪制邊界時游沿,由于線和面的光柵化的方式不同,導致位于同一位置的多邊形和直線的深度值并不相同肮砾,進而導致直線有時在多邊形的里面诀黍,有時在多邊形的外面,這種現(xiàn)象就是"Stiching仗处。
而Z-fighting主要是指當兩個面共面時眯勾,二者的深度值一樣,深度緩沖就不能清楚的將它們兩者分離開來婆誓,位于后面的圖元上的一些像素就會被渲染到前面的圖元上吃环。
使用glPolygonOffset (GLfloat factor, GLfloat units)
可以解決這兩個問題。