Opengl 表面剔除是提高 Opengl 程序渲染效率的一個有效途徑。
我們知道,OpenGL 渲染的基本單位是一個個的三角形面片。無論多么復雜的3D 模
型都是由一個個基本的三角型的面片組成的。
既然是一個面片,那必然就有兩個面,如果其中有一個面被稱為正面,那相應的另一
面就被稱為背面。同一時刻我們在看見某一面的同時,另外一面則必然是看不的。
在這里我們可以想象一個封閉的不透明的幾何體,我們肉眼只能看到它的外面,而
它的內部我們是看不見的。但如果是從 OpenGL的角度來看,如果沒有開啟表面剔除,
則可能有很多從一般常識上看來是看不見的那一面(比如幾何體內部),它也會去渲
染。這顯然會大大降低渲染效率和增加不必要的系統開銷。
那如何才能確定哪個面需要渲染,哪個面不需要渲染呢。
在 Opengl 中有所謂的正面還有背面,以及是剔除正面還是剔除背面,都有相應的設
置方法,接下來就詳細說明。
首先在 OpenGL 中有所謂的“表面剔除”選項。
可以如下調用開啟或關閉表面剔除。
glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE);
如果開啟了表面剔除的選項,則接下來就必須回答兩個問題
1)什么是正面,什么是背面
2)要剔除正面還是剔除背面
首先回答第一個問題,要如何確定一個面是正面還是背面。
在 OpenGL 中,可以調用 glFrontFace 函數來設定。
該函數的原型如下:
void glFrontFace(GLenum mode);
mode 參數的可選的值有 GL_CW 和 GL_CCW(默認值是 GL_CCW)。
GL_CW
表示頂點的排列順序是順時針的面是正面。
GL_CCW
表示頂點的排列順序是逆時針的面是正面(默認值)。
第二個問題,那究竟是要剔除正面還是背面。
這個需要調用 glCullFace 函數來決定。
該函數原型如下:
void glCullFace(GLenum mode);
mode 參數有三個可選項
GL_FRONT // 正面剔除
GL_BACK // 背面剔除(默認值)
GL_FRONT_AND_BACK // 正面、背面都剔除
經過以上設置,Opengl 在渲染圖元之前就會根據相關設置選項進行判斷,以剔
除不需要渲染的圖元,提高渲染的效率。