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)