美文网首页
OpenGL正背面剔除

OpenGL正背面剔除

作者: 奉灬孝 | 来源:发表于2020-07-09 20:18 被阅读0次

    一、在渲染过程中可能产生的问题

    1. 原因

    在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的.对于不可见的部分,应该及早丢弃.
    例如在一个不透明的墙壁后,就不应该渲染.这种情况叫做隐藏面消除(Hidden surface elimination).

    2.示例
    渲染问题展示

    二、解决方案

    1.油画算法
    • 先绘制场景中的离观察者较远的物体,再绘制较近的物体.
    • 例例如下⾯面的图例例: 先绘制红⾊色部分,再绘制⻩黄⾊色部分,最后再绘制灰⾊色部分,即可解决隐藏⾯面消除的问题
      油画算法.png
      油画算法问题:使⽤用油画算法,只要将场景按照物理理距离观察者的距离远近排序,由远及近的绘制即可.那么会出现 什什么问题? 如果三个三⻆角形是叠加的情况,油画算法将⽆无法处理理.
      油画算法问题.png
    2.正背面剔除
    1. 原理
      OpenGL 可以做到检查所有正⾯面朝向观察者的⾯面,并渲染它们。从⽽而丢弃背⾯面朝向的⾯面。这样可以节约⽚片元着⾊色器器的性能,渲染的性能即可提高超过50%
    2. 正背面区分
      正面: 按照逆时针顶点连接顺序的三角形面
      背面: 按照顺时针顶点连接顺序的三角形面
      分析正方体的正背面.png
    3. 正背面区分问题:正⾯和背⾯是有三角形的顶点定义顺序和观察者方向共同决定的。若观察者的观察⽅向发生改变,正⾯和背面也会发生相应的改变。
    • 当观察者在右侧时:右边的三角形为逆时针方向,则为正面;而左侧的三⻆形为顺时针,则为背⾯。
    • 当观察者在左侧时:左边的三⻆形为逆时针⽅向,则为正⾯;而右侧的三⻆形为顺时针,则为背⾯。
    1. 弊端:如果前后两个点都是正面或是背面,这时OpenGL无法区分哪个面在前,哪个面在后,就可能出现下图所示的问题。
      正背面区分问题.png
    2. 有关正背面剔除函数
    • 开启表面剔除(默认背面剔除)
    void glEnable(GL_CULL_FACE);
    
    • 关闭表面剔除(默认背面剔除)
    void glDisable(GL_CULL_FACE);
    
    • ⽤户选择剔除那个面(正面/背面)
    void glCullFace(GLenum mode);
    mode参数为: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默GL_BACK
    
    • 用户指定那个为正面
    void glFrontFace(GLenum mode);
    mode参数为: GL_CW,GL_CCW,默认值:GL_CCW 
    
    • 例如,剔除正面实现(1)
    glCullFace(GL_BACK); 
    glFrontFace(GL_CW);
    
    • 例如,剔除正面实现(2)
    glCullFace(GL_FRONT);
    glFrontFace(GL_CCW);
    

    相关文章

      网友评论

          本文标题:OpenGL正背面剔除

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