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

本文探讨了深度缓冲在3D图形渲染中的作用,从深度排序到Z-Buffer算法的实现,以及OpenGL中的相关函数glDepthTest和glDepthMask的应用。重点讲解了如何利用Z-Buffer确保正确进行深度比较和渲染优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秘境之眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值