03、OpenGL隱藏面消除

在渲染過程中可能產(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); 
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容