
渲染過程中出現(xiàn)的問題
在我們自己繪制的一個甜甜圈案例中,當不對甜甜圈進行旋轉(zhuǎn)的情況下沒有任何問題,但是一旦旋轉(zhuǎn)會出現(xiàn),就會出現(xiàn)入下圖的問題:

隱藏面消除
在繪制3D場景的時候,我們需要決定哪些部分是對觀察者可見的,或者哪些部分是對觀察者不可?的.對于不可見的部分,應該及早丟棄.例如在?個不透明的墻壁后,就不不應該 渲染.這種情況叫做”隱藏?面消除”(Hidden surface elimination)。
此處出現(xiàn)的問題就是隱藏面消除所致。
解決方案探索
油畫算法
先繪制場景中的離觀察者較遠的物體,再繪制較近的物體.
例如下面的圖例: 先繪制紅色部分,再繪制黃色部分,最后再繪制灰?部分,即可解決隱藏面消除的問題。

弊端:使?油畫算法,只要將場景按照物理距離觀察者的距離遠近排序,由遠及近的繪制即可.那么會出現(xiàn)什么問題? 如果三個三?角形是疊加的情況,油畫算法將?法處理.

正背?面剔除(Face Culling)
背景:嘗試相信一個3D圖形,你從任何?一個方向去觀察,最多可以看到幾個?面? 答案是,最多3?面. 從一個立方體的任意位置和方向上看,你不可能看到多于3個面. 那么思考? 我們?yōu)楹我嘤嗟娜ダL制那根本看不到的3個面? 如果我們能以某種方式去丟棄這部分數(shù)據(jù),OpenGL 在渲染的性能即可提?高超過50%
問題:如何知道某個面在觀察者的視口中不會出現(xiàn)?
任何平面都有2個面,正?/背面.意味著你一個時刻只能看到?面.
OpenGL 可以做到檢查所有正面朝向觀察者的?面,并渲染它們.從而丟棄背面朝向的面. 這樣可以節(jié)約片元著??的性能.
如果告訴OpenGL 你繪制的圖形,哪個面是正面,哪個面是背面?
答案: 通過分析頂點數(shù)據(jù)的順序
分析頂點順序
GLfloat vertices[] = {
//順時針
vertices[0], // vertex 1
vertices[1], // vertex 2
vertices[2], // vertex 3
// 逆時針
vertices[0], // vertex 1
vertices[2], // vertex 3
vertices[1] // vertex 2
};
正面/背面區(qū)分:
正?: 按照逆時針頂點連接順序的三?角形?面
背?: 按照順時針頂點連接順序的三?角形?面
分析?立?方體中的正背?面

分析
? 左側三角形頂點順序為: 1—> 2—> 3 ; 右側三?形的頂點順序為: 1—> 2—> 3 .
? 當觀察者在右側時,則右邊的三?形?向為逆時針?向則為正面,?左側的三角形為順時針則為背面
? 當觀察者在左側時,則左邊的三角形為逆時針方向判定為正面,?右側的三?形為順時針判定為背面.
總結
正?和背面是有三角形的頂點定義順序和觀察者方向共同決定的.隨著觀察者的角度方向的改變,正?背面也會跟著改變。
正背面剔除方案代碼實現(xiàn)
1.開啟表面剔除(默認背面剔除)
void glEnable(GL_CULL_FACE);
2.關閉表面剔除(默認背面剔除)
void glDisable(GL_CULL_FACE);
3.用戶選擇剔除那個面(正面/背面)
void glCullFace(GLenum mode);
mode參數(shù)為:GL_FRONT,GL_BLAK,GL_FRONT_AND_BACK,默認GL_BACK
4.用戶指定繞序那個為正?
void glFrontFace(GLenum mode)
mode參數(shù)為:GL_CW,GL_CCW,默認:GL_CCW
5.剔除正面實現(xiàn)(1)
glCullFace(GL_BACK);
glFrontFace(GL_CW);
5.剔除正面實現(xiàn)(2)
glCullFace(GL_FRONT);