在渲染過程中可能產(chǎn)生的問題
在繪制3D場景的時候,我們需要決定哪些部分是對觀察者可見的,或者哪些部分是對觀察者不可見的。不可見的部分,應該盡早的拋棄掉。例如一個不同的墻壁后,就不應該渲染。這種情況叫作隱藏面消除(Hidden surface elimination)
油畫算法(基本不使用這種方法,也不推薦)
- 先繪制場景中離觀察者較遠的物體,再繪制較勁的物體。
- 例如下面的例子,繪制順序:紅色->黃色->灰色,即可解決隱藏面消除的問題
油畫法.png
油畫算法的弊端
- 使用油畫算法,只要將場景按照物理距離觀察者的距離遠近排序,由遠及近的繪制即可。如果三個三角形是疊加的情況,油畫算法將無法處理。
三角形疊加.png
正背面剔除
- 解決問題
- 如何告訴OpenGL 你繪制的圖形,哪個面是正面,哪個面是背面?
- 通過分析頂點數(shù)據(jù)的順序。
- 分析頂點順序
分析頂點順序.png
- 正面/背面區(qū)分
- 正面:按照逆時針頂點連接順序的三角形面
- 背面:按照順時針頂點連接順序的三角形面
- 解析立方體中的正背面
正方體的正背面.png
- 分析
- 左側三?形頂點順序為: 1—> 2—> 3 ; 右側三?形的頂點順序為: 1—> 2—> 3 .
- 當觀察者在右側時,則右邊的三角形方向為逆時針方向則為正面,而左側的三?形為順時針則為背面
- 當觀察者在左側時,則左邊的三?形方向為逆時針方向則為正面,而右側的三角形為順時針則為背面
- 總結
- 正面和背面是有三角形的頂點定義順序和觀察者方向共同決定的.隨著觀察者的角度方向的改變,正面背?也會跟著改變
代碼
- 開啟表?剔除(默認背?剔除)
void glEnable(GL_CULL_FACE);
- 關閉表?剔除(默認背?剔除)
void glDisable(GL_CULL_FACE);
- 用戶選擇剔除的那個面(正面/背面)
void glCullFace(GLenum mode);
mode參數(shù):GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默認GL_BACK
- 用戶指定繞序哪個為正面
void glFrontFace(GLenum mode)
mode參數(shù)為: GL_CW,GL_CCW,默認值:GL_CCW(逆時針頂點順序的三角形)
- 例如,剔除正?實現(xiàn)(1)
void glCullFace(GL_BACK);
void glFrontFace(GL_CW);//修改順時針頂點順序的三角形為正面
- 例如,剔除正?實現(xiàn)(2)
void glCullFace(GL_Front);



