美文网首页
16.opengl高级-面剔除

16.opengl高级-面剔除

作者: 天叔 | 来源:发表于2020-06-28 23:50 被阅读0次

    一、原理介绍

    这一节比较简单,从相机方向看,一个3D形状的图形总有部分面是看不到的,这部分看不到的片元可以剔除掉,不参与计算,以提升渲染效率。前提是图形必须是闭合的,比如正方体,能节省50%以上的时间。

    实现逻辑简单巧妙,假设我们能看到的面上定义一个三角形,三角形的三个顶点按逆时针来组织绘制顺序,那么光栅化阶段,背面的三角形变成了顺时针,那么就可以剔除掉。参考下图:

    面剔除 顺/逆时针

    之前定义图形,比较随意,如果要实现面剔除,就得每个三角形严格按照正面能看到时的顺时针方向来组织顺序了,有没有感觉很费劲?对于复杂的图形应该有工具可以导出坐标吧?

    二、实现效果

    方便观察,效果图按照正面剔除(反向剔除)来实现 正面剔除

    三、代码说明

    涉及的API也很少

    1. 启动面剔除(默认是禁止态)
    glEnable(GL_CULL_FACE);
    
    1. 如果实现上面的效果--正面剔除,正常情况下不会这么干,默认是GL_BACK
    glCullFace(GL_FRONT);
    
    //glCullFace有三个可用的选项
    //GL_BACK:只剔除背向面。
    //GL_FRONT:只剔除正向面。
    //GL_FRONT_AND_BACK:剔除正向面和背向面。
    
    1. 还有更丰富的操作,定义逆时针是正面,感觉正常情况也不会这么干
    glFrontFace(GL_CCW);
    

    四、完整代码

    本章节实在太简单,不贴完整代码了

    相关文章

      网友评论

          本文标题:16.opengl高级-面剔除

          本文链接:https://www.haomeiwen.com/subject/lvfnfktx.html