由於我們看一個立方體不管從任何方向看最多看到3個平面,那么我們就沒有必要去繪制剩下的三個平面,並且這樣做將為性能帶來超過50%的優化,何樂而不為!
所以就引入了面剔除(Face culling),此時有個問題是我們如何去判斷一個面是正面還是反面呢。OpenGL引入了分析頂點數據的連接順序(Winding order)。例如:
用代碼表示即為
1 GLfloat vertices[] = { 2 //順時針 3 vertices[0], // vertex 1 4 vertices[1], // vertex 2 5 vertices[2], // vertex 3 6 // 逆時針 7 vertices[0], // vertex 1 8 vertices[2], // vertex 3 9 vertices[1] // vertex 2 10 };
OpenGL使用這個信息在渲染你的基本圖形的時候決定這個三角形是三角形的正面還是三角形的背面。默認情況下,逆時針的頂點連接順序被定義為三角形的正面。
在頂點數據中,我們定義的是兩個逆時針順序的三角形,但從觀察者的方面看,后面的三角形是順時針的,如果我們仍以1、2、3的順序以觀察者當面的視野看的話。即使我們以逆時針順序定義后面的三角形,但它現在還是變為順時針。這正是我們打算剔除(丟棄)的不可見的面!
接下來開始面剔除:
開始之前我們要將頂點數據按逆時針定義,把所有三角的頂點都定義為逆時針是一個很好的習慣
首先glEnable(GL_CULL_FACE)打開面剔除
之后選擇要刪除背面還是正面glCullFace(GL_BACK);
glCullFace
函數有三個可用的選項:
- GL_BACK:只剔除背面。
- GL_FRONT:只剔除正面。
- GL_FRONT_AND_BACK:剔除背面和正面。
另外我們可以自己設置是逆時針為正還是順時針為正
glFrontFace(GL_CCW);
默認值是GL_CCW
,它代表逆時針,GL_CW
代表順時針順序。
最終渲染
呦!打球去了!!!