零基础学习OpenGL(三)--深度测试

这篇博客介绍了OpenGL中的深度测试原理和应用。深度测试用于确定片段在场景中的前后关系,通过比较片段深度值与深度缓冲,决定是否更新缓冲并显示片段。启用深度测试、设置深度测试函数以及解决深度冲突的方法是关键,确保正确渲染3D场景。
摘要由CSDN通过智能技术生成

       深度缓冲:在每个片段中储存了信息,以16、24、32位float的形式储存它的深度值。(片段着色器运行之后,在屏幕空间中运行。)

       当深度测试启用,OpenGL会将一个片段的深度值和深度缓冲的内容相比,如果测试通过,深度缓冲将更新为新的深度值;如果测试失败,片段丢弃。

        启用深度测试:

                 glEnable(GL_DEPTH_TEST);

         在每个渲染迭代之前清除深度缓冲:

                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

          在某些情况下,如果我们只需要对所有片段深度测试并丢弃测试失败的片段,而不希望更新深度缓存的话,使用下面改为只读:

                  glDepthMask(GL_FALSE);

          深度测试函数:(我们来控制什么时候通过或丢弃一个片段,什么时候更新深度缓冲)

                  glDepthFunc(GL_LESS);

           GL_LESS可以是下面的这些函数:

GL_ALWAYS永远通过深度测试
GL_NEVER永远不通过深度测试
GL_LESS在片段深度值小于缓冲的深度值时通过测试
GL_EQUAL在片段深度值等于缓冲区的深度值时通过测试
GL_LEQUAL在片段深度值小于等于缓冲区的深度值时通过测试
GL_GREATER在片段深度值大于缓冲区的深度值时通过测试
GL_NOTEQUAL在片段深度值不等于缓冲区的深度值时通过测试
GL_GEQUAL在片段深度值大于等于缓冲区的深度值时通过测试

举个栗子:

 glEnable(GL_DEPTH_TEST);

 glDepthFunc(GL_ALWAYS);

总是通过深度测试,那也就表示没有深度测试,结果是最后绘制的就在之前绘制的上面。

 而如果使用glDepthFunc(GL_LESS),结果为:

      深度缓冲的值是0.0--1.0之间,但是观察空间下z值为近平面到远平面之间任意的值,需要将z值变换在0.0--1.0之间。公式如下:

       在实践中是几乎永远不会使用这样的线性深度缓冲。要想有正确的投影性质,需要使用一个非线性的深度方程,它是与 1/z 成正比的。它做的就是在z值很小的时候提供非常高的精度,而在z值很远的时候提供更少的精度。

        深度冲突:深度值一样的地方,深度缓冲没有足够的精度来决定两个形状哪个在前面。结果就是这两个形状不断地在切换前后顺序,这会导致很奇怪的花纹。

        所以,不要把物体摆的太靠近,防止三角形重叠;近平面设置的远一些,因为精度在靠近近平面的时候非常高,但是太远会导致近处的被裁剪。

 

参考自https://learnopengl-cn.github.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值