openGL之API学习(五十三)前面剔除、背面剔除、片段擦除

片段的擦除(discarding fragments)和前面剪裁、后面剪裁(front face culling and back face culling)

前面剔除、背面剔除

由于这种绘制方法好像两个面都绘制成一模一样(当然实际只绘制一个面,也只可能看到一个面),所以又成为双面渲染。

背面剔除

 

使用背面剔除来减少需要绘制的三角形数量

背面剔除,顾名思义,就是在渲染的时候,将背对着观察者的面片丢弃,只将正面朝向观察者(观察者能看到的)面片进行计算。

OpenGL在渲染的时候如果看到这个面的顶点绕序不是正面绕序,那就判定其实背面,把它丢弃。

顶点绕序有两种:顺时针和逆时针。如下图,左边的就是顺时针绕序,右边的就是逆时针绕序:

 

openGL之API学习(五十三)前面剔除、背面剔除、片段擦除_第1张图片

顶点绕序

每个三角形图元的三个顶点都构成了一个顶点绕序。在渲染的时候,OpenGL会用这些信息来判断这是正面还是背面。默认情况下,顶点是逆时针顺序的会被认为是正面。

D3D中默认顶点以顺时针方向(在观察坐标系中)形成的三角形为正面,以逆时针方向形成的三角形为背面。

如何启用背面剔除

glEnable函数,传入的参数是GL_CULL_FACE

OpenGL还提供了一些控制背面剔除效果的函数,甚至连前面也可以剔除掉。调用glCullFace(GL_FRONT);就可以剔除正面。可以作为glCullFace参数的选项有:GL_FRONT,GL_BACK和GL_FRONT_AND_BACK。

要注意,剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。

还有一个函数:glFrontFace()。用来设置哪个面是正面。默认参数为GL_CCW表示逆时针为正面,你也可以设置成GL_CW表示顺时针为正面。一般我们不需要去修改它。

启用背面剔除一般而言总能改善渲染性能,但是具体是否开启背面剔除还是要根据应用场景而定。当渲染某些非封闭类型几何对象,例如一颗草的模型时,则不需要开启背面剔除。

背面剔除执行阶段

Unity中的背面剔除在光栅化阶段进行,执行在Vertex Shader 之后,在Fragment Shader片元着色器之前,通过Shader中的Cull指令来控制背面剔除的开启和关闭,
Unity手册上的图示显示的比较清晰:
openGL之API学习(五十三)前面剔除、背面剔除、片段擦除_第2张图片

你可能感兴趣的:(opengl,图形学,着色器,GLSL,openGL之API学习)