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

       深度缓冲:在每个片段中储存了信息,以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

猜你喜欢

转载自blog.csdn.net/jfy307596479/article/details/84565969