一个3D的图形,我们从任意方向同时可以看到的面数是少于图形的总面数的,如果看不到的面不执行着色,效率会大大提高。OpenGL能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面,节省我们很多的片段着色器调用。OpenGL区分哪些是正向面哪些是背向面的方法是:分析顶点数据的环绕顺序。
当定义一组三角形顶点时,可以选择顺时针,也可以选择逆时针:
float vertices[] = {
// 顺时针
vertices[0], // 顶点1
vertices[1], // 顶点2
vertices[2], // 顶点3
// 逆时针
vertices[0], // 顶点1
vertices[2], // 顶点3
vertices[1] // 顶点2
};
OpenGL在渲染图元的时候将使用这个信息来决定一个三角形是一个正向三角形还是背向三角形。默认情况下,逆时针顶点所定义的三角形将会被处理为正向三角形。
如下图:在顶点数据中,我们定义的是两个逆时针顺序的三角形。然而,从观察者的方面看,后面的三角形是顺时针的,如果我们仍以1、2、3的顺序以观察者当面的视野看的话。即使我们以逆时针顺序定义后面的三角形,它现在还是变为顺时针。它正是我们打算剔除(丢弃)的不可见的面!
OpenGL的面剔除选项,它默认是禁用状态的。
glEnable(GL_CULL_FACE);
如果我们只想剔除正向面而不是背向面会怎么样?我们可以调用glCullFace来定义这一行为:
glCullFace(GL_FRONT);
也可以通过调用glFrontFace,告诉OpenGL我们希望将顺时针的面(而不是逆时针的面)定义为正向面:
glFrontFace(GL_CCW);