• OpenGL之深度缓冲区与Z-Buffer消隐算法


    1.1 深度缓冲(Depth buffer)

    • Projection :3D → 2D : (x,y,z) → (wx,wy),投影后也存在一个z值,为(wx,wy,wz);
    • 在投影时,每个投影点的深度也会被记录下来,写入深度缓冲;
      在这里插入图片描述
    • 在光栅化时,每个片元的深度会被计算出来,写入深度缓冲区;

    1.2 视域空间中的深度范围

    • 透视投影后深度的坐标范围是 [0,1],其深度分布不均匀;
    • 距离视点越近,精度越大,越远精度越小;
      在这里插入图片描述

    1.3 消隐的方法

    • Depth Sorting Method(深度排序算法);
    • Area-Subdivision Method(区域子分算法);
    • Ray Casting Method(光线投射法);
    • Z-Buffer算法

    在把显示对象的每个面上的每一点的颜色值填入帧缓冲器相应单元前,要把这个点的深度值与Z-Buffer中的相应单元的值进行比较。只有前者小于后者时才能改变帧缓冲器的那一个单元的值,同时Z-buffer中相应的单元的值也要改变成这点的深度值;否则帧缓冲器相应的单元的值不变。

    1.4 OpenGL中深度缓冲的函数

    glEnable(GL_DEPTH_TEST);
    
    • 会进行深度比较,并且根据当前绘制内容更新depth buffer;
    void glDepthFunc(GLenum func);
    
    • 深度比较的方式:func的值为:GL_NEVER、GL_LESS、GL_LEQUAL、GL_EQUAL、GL_GREATER、GL_NOTEQUAL、GL_GEQUAL、GL_ALWAYS;
    void glDepthMask(GLboolean flag);
    
    • 设置是否更新深度缓冲;
    glDisable(GL_DEPTH_TEST);
    
    • 深度比较和更新深度缓冲这两个动作都不会发生;

    当只想做深度比较,但不更新深度缓冲,则:

    glEnable(GL_DEPTH_TEST);
    glDepthMask(false);
    

    在背景不变,前景变化的场景中,可以高效率的进行绘制,分为背景的预绘制,以及前景的实时绘制。

    OpenGL 默认值为:

    glDisable(GL_DEPTH_TEST);
    glDepthMask(false);
    glDepthFunc(GL_LESS);
    

    只做深度比较,不更新深度缓冲,则:

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_ALWAYS);
    glDepthMask(true);
    
  • 相关阅读:
    全网最全音视频媒体流
    Java多线程
    iOS中的3种定时器
    [SpringCloud] Eureka 与 Ribbon 简介
    aiohttp ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] 错误处理
    VPN都容易受到泄露流量的TunnelCrack攻击
    [附源码]java毕业设计西柚网购物系统
    Android 图片编码之必备技能
    电气工程及其自动化
    震惊!我竟然在1080Ti上加载了一个35亿参数的模型(ZeRO, Zero Redundancy Optimizer)
  • 原文地址:https://blog.csdn.net/TxyITxs/article/details/127097993