一、原理介绍
这一节比较简单,从相机方向看,一个3D形状的图形总有部分面是看不到的,这部分看不到的片元可以剔除掉,不参与计算,以提升渲染效率。前提是图形必须是闭合的,比如正方体,能节省50%以上的时间。
实现逻辑简单巧妙,假设我们能看到的面上定义一个三角形,三角形的三个顶点按逆时针来组织绘制顺序,那么光栅化阶段,背面的三角形变成了顺时针,那么就可以剔除掉。参考下图:
面剔除 | 顺/逆时针 |
---|
之前定义图形,比较随意,如果要实现面剔除,就得每个三角形严格按照正面能看到时的顺时针方向来组织顺序了,有没有感觉很费劲?对于复杂的图形应该有工具可以导出坐标吧?
二、实现效果
方便观察,效果图按照正面剔除(反向剔除)来实现 正面剔除三、代码说明
涉及的API也很少
- 启动面剔除(默认是禁止态)
glEnable(GL_CULL_FACE);
- 如果实现上面的效果--正面剔除,正常情况下不会这么干,默认是GL_BACK
glCullFace(GL_FRONT);
//glCullFace有三个可用的选项
//GL_BACK:只剔除背向面。
//GL_FRONT:只剔除正向面。
//GL_FRONT_AND_BACK:剔除正向面和背向面。
- 还有更丰富的操作,定义逆时针是正面,感觉正常情况也不会这么干
glFrontFace(GL_CCW);
四、完整代码
本章节实在太简单,不贴完整代码了
网友评论