为什么需要面剔除
一个封闭立方体,任何角度最多看到 3 个面,另外 3 个面永远看不到。如果不画它们,节省超过 50% 的片段着色器开销。
怎么判断正反面
通过顶点的连接顺序,定义能看到一个三角形时,它一定是正面朝向吗,opengl采用右手坐标系,因此定义的三角形应该是逆时针的,这个判断变化在光栅化之前,用的是屏幕空间的投影坐标。
同样的定义一段正面三角形1->2->3,是逆时针。在背面看按照123的顺序,是顺时针。因此被判定为背面。只需要定义一次顶点顺序,当三角形背对你时,它的屏幕空间环绕方向会自动翻转,GPU 自动把它识别为背面。
相关API
| OpenGL | Unity Shader |
|---|---|
glEnable(GL_CULL_FACE) |
默认就开启了 |
glCullFace(GL_BACK) |
Cull Back背面剔除(默认) |
glCullFace(GL_FRONT) |
Cull Front正面剔除 |
glCullFace(GL_FRONT_AND_BACK) |
没直接对应(相当于不画了) |
glFrontFace(GL_CCW) |
不需要手动设,Unity 按平台自动处理 |
| 不开启面剔除 | Cull Off |
默认值是GL_CCW,它代表逆时针,GL_CW代表顺时针顺序。