4 - 面剔除

为了节省片段着色器的执行数以提升效率,OpenGL只渲染观察者能看到的面,这被称为面剔除(Face Culling)。

面剔除

原理

OpenGL能够检查面向观察者的面,并渲染他们,而丢弃那些背向的面,从而节省很多的片段着色器调用。OpenGL通过 分析顶点的环绕顺序(Winding Order) 来判断哪些面是正向的,哪些面是背向的。

当我们定义一组三角形时,会以顺时针/逆时针的方式去定义它的三个顶点:

默认情况下,OpenGL将 逆时针顶点所定义的三角形认作正向三角形

例如上图,我们用逆时针顺序定义了这两个三角形,观察者只能看到前面的三角形(逆时针正向),而看不到后面的三角形(顺时针背向);观察者绕到后面时同理,他也只能看到他面前的三角形(本图中背向的三角形此时是正向的),而看不到后面的三角形(本图中正向的三角形此时是背向的)。

使用

OpenGL的面剔除选项默认是禁用的,要想启用面剔除,得启用 GL_CULL_FACE选项:

glEnable(GL_CULL_FACE);

这一行代码以后,所有背向面都将被丢弃。例如下图中的地板,只能从下面看到它:

要想改变剔除的面类型,可以通过glCullFace(GlEnum xxx)来修改,它有三个可用的选项:

  • GL_BACK:只剔除背向面
  • GL_FRONT:只剔除正向面
  • GL_FRONT_AND_BACK:剔除正向和背向面

它的初始值是GL_BACK

也能修改正向面的定义方式,通过glFrontFace(GlEnum xxx)来修改:

  • GL_CCW:逆时针方向,是默认值
  • GL_CW:顺时针方向

参考资料

  • 面剔除 - LearnOpenGL CN (learnopengl-cn.github.io)