OpenGL學習腳印:背面剔除(Face Culling) - 程式人生
文章推薦指數: 80 %
OpenGL學習腳印:背面剔除(Face Culling). 阿新• • 發佈:2019-02-02. 寫在前面在繪製封閉型別的幾何物件時,開啟背面剔除功能能夠提高渲染效能。
本節簡要介紹下背面 ...
程式人生>>OpenGL學習腳印:背面剔除(FaceCulling)
OpenGL學習腳印:背面剔除(FaceCulling)
阿新••發佈:2019-02-02
寫在前面
在繪製封閉型別的幾何物件時,開啟背面剔除功能能夠提高渲染效能。
本節簡要介紹下背面剔除,示例程式可以在我的github下載。
什麼是背面剔除
當我們觀察場景中物件時,一般只能以一定角度來觀察,那麼物件的某些面我們是看不到的,例如你觀察一個立方體,最多隻能同時看到3個面,有時只能看到1個面,而我們繪製時如果不採取剔除背面的措施,則要繪製6個面,其中包括一些,我們根本看不到的面。
對於立方體這個面較少的幾何物件,效能開銷不明顯,但是對於複雜的模型,開啟背面剔除則能明顯改善渲染效能。
背面剔除,就是早點丟棄對觀察者來說是背面的片元的一種方法。
背面剔除的使用
上面提到,要早點丟棄對觀察者來說是背面的片元,那麼現在的問題是如何確定哪個面是背面的問題?OpenGL中使用頂點繞序(windingorder)來確定。
所謂繞序就是當幾何物件細分為三角形時,三角形頂點相對於中心的定義順序,具體如下圖所示(來自openglwiki):
左邊的圖中指定頂點的順序是順時針的,右邊是逆時針的。
以三角面指向觀察者的方向為大拇指指向,其餘手指逆時針繞著大拇指,如果手指的繞向和三角面頂點繞向一致,則這個面為正面,否則為背面。
在OpenGL中,我們指定逆時針和順時針的三角形頂點如下:
GLfloatvertices[]={
//Clockwise
vertices[0],//vertex1
vertices[1],//vertex2
vertices[2],//vertex3
//Counter-clockwise
vertices[0],//vertex1
vertices[2],//vertex3
vertices[1]//vertex2
};
需要注意的是,三角形的正面還是背面這個是根據觀察者的觀察方向,而變動的。
例如下面的圖中(來自www.learnopengl.com):
左側的三角形頂點順序為1->2->3,右側的三角形頂點順序為1->2->3。
當觀察者在右側時,則右邊的三角形方向為逆時針方向為正面,而左側的三角形為順時針則為背面;當觀察者轉到左側時,左側的三角形為逆時針繞序判定為正面,而右側的三角形為順時針繞序判定為背面。
可以看出正面和背面是由三角形的頂點定義順序和觀察者的觀察方向共同決定的,而且隨著觀察方向的改變,正面和背面將會跟著改變。
在OpenGL中開啟背面剔除需要使用:
glEnable(GL_CULL_FACE);
同時OpenGL提供了函式glCullFace來供使用者選擇剔除哪個面:
APIvoidglCullFace(GLenummode);
mode引數為GL_FRONT,GL_BACK,GL_FRONT_AND_BACK3個列舉型別。
預設為GL_BACK.
以及glFrontFace函式用來根據繞序指定哪個為正面:
APIvoidglFrontFace(GLenummode);
mode引數為GL_CW,GL_CCW。
預設值是GL_CCW。
如果要剔除正面,程式碼:
glCullFace(GL_BACK);
glFrontFace(GL_CW);
和下面的程式碼等價:
glCullFace(GL_FRONT);
首先我們來對比下使用背面剔除和未使用背面剔除時,穿過立方體內部,我們看到的景象。
下圖是沒有開啟背面剔除時:
可以看到,穿過內部時,看到了立方體後面的部分。
當開啟了背面剔除時,穿過內部時,看不到立方體的背面:
當我們剔除正面時,觀察者的位置,決定了哪是正面,當觀察者處於立方體正面時,剔除正面看到效果:
當觀察者移動到可以看到立方體三個面時,判定正面,頂面和右側面為正面,則剔除正面後的效果為:
最後的說明
在使用背面剔除時需要注意,在指定物體表面的頂點時,頂點的順序需要定義為正向的逆時針順序。
啟用背面剔除一般而言總能改善渲染效能,但是具體是否開啟背面剔除還是要根據應用場景而定。
當渲染某些非封閉型別幾何物件,例如一顆草的模型時,則不需要開啟背面剔除。
Java縮放圖片及剪裁圓形圖示程式碼
«上一篇
淘寶購物券,淘寶網的購物券怎麼用下一篇»
相關推薦
OpenGL學習腳印:背面剔除(FaceCulling)
寫在前面
在繪製封閉型別的幾何物件時,開啟背面剔除功能能夠提高渲染效能。
本節簡要介紹下背面剔除,示例程...
OpenGL學習腳印:模型變換(modeltransformation)
寫在前面
前面為本節內容準備了向量和矩陣、線性變換等內容,本節開始學習OpenGL中的座標處理。
Ope...
OpenGL學習腳印:投影矩陣和視口變換矩陣(math-projectionandviewportmatrix)
寫在前面
前面幾節分別介紹了模型變換,視變換,本節繼續學習OpenGL座標變換過程中的投影變換。
這裡主...
OpenGL學習腳印:模型載入初步-載入obj模型(loadobjmodel)
寫在前面
前面介紹了光照基礎內容,以及材質和lightingmaps,和光源型別,我們對使用光照增強場景真實...
OpenGL學習腳印:模板測試(stenciltesting)
寫在前面
上一節介紹了深度測試,本節繼續學習一個高階主題-模板測試(stenciltesting)。
模板緩衝...
OpenGL學習腳印:反走樣初步(Anti-aliasingbasic)
寫在前面
目前,我們繪製的圖形中存在瑕疵的,觀察下面這個立方體:
仔細看,立方體的邊緣部...
OpenGL學習腳印:立方體紋理和天空包圍盒(CubemapsAndSkybox)
寫在前面
之前學習了2D紋理對映,實際上還有其他型別的紋理有待我們進一步學習,本節將要學習的立方...
OpenGL學習腳印:二維紋理對映(2Dtextures)
寫在前面
前面兩節介紹了向量和矩陣,以及座標和轉換相關的數學,再繼續討論模型變換等其他包含數學內容的部...
OpenGL學習腳印:深度測試(depthtesting)
寫在前面
上一節我們使用AssImp載入了3d模型,效果已經令人激動了。
但是繪製效率和場景真實感還存在不足...
OpenGL學習腳印:建立更多的例項(instancingobject)
寫在前面
前面我們學習了模型載入的相關內容,併成功載入了模型,令人十分興奮。
那時候載入的是少量的模型,...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
OpenGL學習腳印:背面剔除(Face+Culling)
Linux+ARM+IIC+I2C+EEPROM+讀寫操作
VSync+Count+垂直同步
sed指定某行插入、追加、全局替換
2017雅禮集訓+Day2
1.Nginx安裝配置
原來短劇本還有這些!
C++工程文件夾中的bin和obj文件夾有何用處?(補充多文件結構)
當編譯錯誤時
基於圖靈機器人的聊天機器人實現(一)
延伸文章資訊
- 1OpenGL學習腳印:背面剔除(Face Culling) - 程式人生
OpenGL學習腳印:背面剔除(Face Culling). 阿新• • 發佈:2019-02-02. 寫在前面在繪製封閉型別的幾何物件時,開啟背面剔除功能能夠提高渲染效能。本節簡要介紹下背面 ...
- 2learnopengl学习笔记——面剔除(face culling) - CSDN博客
这正是面剔除(Face Culling)所做的。OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多 ...
- 3Face Culling - OpenGL Wiki
- 4OpenGL Tutorial 16 - Face Culling & FPS Counter - YouTube
- 5Back-face culling - Wikipedia
In computer graphics, back-face culling determines whether a polygon of a graphical object is vis...