OpenGL(六)-OpenGL隱藏面消除解決方案

logo.jpg

渲染過程中出現(xiàn)的問題

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

1.png
隱藏面消除

在繪制3D場景的時候,我們需要決定哪些部分是對觀察者可見的,或者哪些部分是對觀察者不可?的.對于不可見的部分,應該及早丟棄.例如在?個不透明的墻壁后,就不不應該 渲染.這種情況叫做”隱藏?面消除”(Hidden surface elimination)。

此處出現(xiàn)的問題就是隱藏面消除所致。

解決方案探索

油畫算法

先繪制場景中的離觀察者較遠的物體,再繪制較近的物體.
例如下面的圖例: 先繪制紅色部分,再繪制黃色部分,最后再繪制灰?部分,即可解決隱藏面消除的問題。


3436062994FA52604C9BC23E46F23C27.png

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

252843D74388CE12FA9111D4B2C44D16.png

正背?面剔除(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ū)分:
正?: 按照逆時針頂點連接順序的三?角形?面
背?: 按照順時針頂點連接順序的三?角形?面

分析?立?方體中的正背?面

9C32D0645F4B72FA1BBFEA49894D15C1.png

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

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