-
在繪制3D場(chǎng)景的時(shí)候,旋轉(zhuǎn)中就會(huì)出現(xiàn)如下圖所示的情況!
截屏2020-07-09 下午10.03.23.png
- 顯然旋轉(zhuǎn)中會(huì)把繪制的3D場(chǎng)景可見部分與不可見部分更替變換
- 但對(duì)觀察者不可見的部分,應(yīng)該及早丟棄,以免出現(xiàn)如圖所示的情況
- 這種不應(yīng)該渲染的叫做:隱藏面消除
解決方案
1. 油畫算法
- 先繪制場(chǎng)景中的離觀察者較遠(yuǎn)的物體,再繪制較近的物體
-
例如下?的圖例: 先繪制紅色部分,再繪制?色部分,最后再繪制灰?部分,即可解決隱藏?面消除的問題
截屏2020-07-09 下午10.27.27.png
注意:
-
油畫算法也是有弊端:如果三個(gè)三?角形是疊加的情況,油畫算法將?法處理.
截屏2020-07-09 下午10.30.13.png
2.正背面剔除(Face Culling)
思考:
- 一個(gè)3D圖形,從任何一個(gè)方向來觀察,最多可以看到幾個(gè)面?
- 顯然在一個(gè)立方體的任意位置和方向看,最多三個(gè)面
- 既然看不到其他的面,如果以某種方式丟棄這部分?jǐn)?shù)據(jù),openGL在渲染的性能可能提高超過50%
結(jié)論:
- 任何平面都有二個(gè)面:正反面,即同一時(shí)刻只能看到一面
- OpenGL可以做到檢查所有正面朝向觀察者的面,并渲染它們,從而丟棄背面朝向的面,這樣可以節(jié)約片元著色器的性能
那么問題來了,繪制的圖形哪個(gè)面是正面,哪個(gè)是反面呢?
-
可以通過分析頂點(diǎn)數(shù)據(jù)的順序如下圖:
截屏2020-07-10 上午12.19.04.png
可得:
- 正面:按照逆時(shí)針頂點(diǎn)連接順序的三角形面
- 背面:按照順時(shí)針頂點(diǎn)連接順序的三角形
立方體中的正背面

截屏2020-07-10 上午12.24.31.png
由圖中可得:
- 左側(cè)三角形頂點(diǎn)順序?yàn)椋?->2->;右側(cè)三角形的頂點(diǎn)順序?yàn)椋?->2->3
- 當(dāng)觀察者在右側(cè)時(shí),則右邊的三角形方向?yàn)槟鏁r(shí)針方向?yàn)檎?,而左?cè)的三角形順時(shí)針為背面
- 當(dāng)觀察者在左側(cè)時(shí),則左側(cè)的三角形為逆時(shí)針方向判定為正面,而右側(cè)的三角形為順時(shí)針判定為背面
結(jié)論:
- 正面和背面是三角形的頂點(diǎn)定義順序和觀察者方向共同決定的,隨著觀察者的角度方向的改變,正背面也會(huì)跟著改變
立方體中的正背面代碼剔除
開啟表?剔除(默認(rèn)背面剔除)
void glEnable(GL_CULL_FACE)關(guān)閉表面剔除(默認(rèn)背面剔除)
void glDisable(GL_CULL_FACE)?戶選擇剔除那個(gè)面(正面/背面)
void glCullFace(GLenum mode) mode參數(shù)為: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK 默認(rèn)GL_BACK ?用戶指定繞序那個(gè)為正?面用戶指定繞序那個(gè)為正面
void glFrontFace(GLenum mode) mode參數(shù)為: GL_CW,GL_CCW 默認(rèn)值:GL_CCW



