由于我们看一个立方体不管从任何方向看最多看到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
代表顺时针顺序。
最终渲染
呦!打球去了!!!