面剔除
能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数! OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)。
环绕顺序 > 每组组成三角形图元的三个顶点就包含了一个环绕顺序。OpenGL在渲染图元的时候将使用这个信息来决定一个三角形是一个正向三角形还是背向三角形。默认情况下,逆时针顶点所定义的三角形将会被处理为正向三角形。 > 当你定义顶点顺序的时候,你应该想象对应的三角形是面向你的,所以你定义的三角形从正面看去应该是逆时针的。这样定义顶点很棒的一点是,实际的环绕顺序是在光栅化阶段进行的,也就是顶点着色器运行之后。这些顶点就是从观察者视角所见的了
面剔除 OpenGL能够丢弃那些渲染为背向三角形的三角形图元。既然已经知道如何设置顶点的环绕顺序了,我们就可以使用OpenGL的面剔除选项了,它默认是禁用状态的。
cpp glEnable(GL_CULL_FACE);glCullFace函数有三个可用的选项:- GL_BACK:只剔除背向面。
- GL_FRONT:只剔除正向面。
- GL_FRONT_AND_BACK:剔除正向面和背向面。
除了需要剔除的面之外,我们也可以通过调用
glFrontFace,告诉OpenGL我们希望将顺时针的面(而不是逆时针的面)定义为正向面:cpp glFrontFace(GL_CCW);默认值是GL_CCW,它代表的是逆时针的环绕顺序,另一个选项是GL_CW,它(显然)代表的是顺时针顺序。代码解释
首先启用面剔除
cpp glEnable(GL_CULL_FACE);指定绕向顺序和剔除面
cpp // 默认情况下,逆时针顶点所定义的三角形将会被处理为正向三角形, //1. 指定正面为逆时针,再剔除正面,则剔除正面 //glCullFace(GL_FRONT); //glFrontFace(GL_CCW); //2. 指定正面为顺时针(实际的正面被指定为了背面),然后剔除背面,则效果上正面被剔除了。 glCullFace(GL_BACK); glFrontFace(GL_CW);