OpenGL-faceculling
1.环绕顺序
有时候我们需要将背对我们的面剔除,因为计算这些面然后在深度测试中丢弃,开销会很大。所以我们需要知道哪些面试背对我们的,然后将他们提前丢弃。OpenGL所采用的方法就是根据顶点的环绕顺序判断法向量方向。
通过右手来判断,四指遵循顶点环绕顺序,大拇指所指的就是面的朝向。
2.面剔除
和前面的例子一样,面剔除默认也是关闭的,需要可爱的我们手动来打开
glEnable(GL_CULL_FACE);
对于剔除的面,我们也可以通过glCullFace
来自行定义
glCullFace(GL_FRONT);
选项 | 剔除的面 |
---|---|
GL_BACK | 背向面 |
GL_FRONT | 正向面 |
GL_FRONT_AND_BACK | 两种面都剔除 |
同时我们也可以定义什么是正向面
glFrontFace(GL_CCW);
选项 | 正向面定义 |
---|---|
GL_CCW | 面对相机时顶点逆时针 |
GL_CW | 面对相机时顶点顺时针 |
举个栗子
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
上面这些告诉opengl,顺时针顺序的顶点代表正向面,剔除背向面。
从表面上看来,就是只有默认的背向面被渲染了。
有时候我们为了性能优化使用了面剔除,却发现渲染的面出现了问题,这时候可能是模型的法向量出现了问题,尽管在关闭面剔除时我们并看不出什么异样。