主要是学习过程中的要点总结,学习渠道为:https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/
要点:
1.窗口系统会自动创建关于每个片段的深度缓冲。它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。
2.当深度测试启动,Opengl会将片段与深度缓冲的内容对比。成功替换,失败丢弃。
3.深度缓冲是在模板测试之后
4.GLSL内建变量gl_FragCoord的x和y分量代表了片段的屏幕空间坐标((0,0)在左下角)。z分量包含真正的深度值。其可以在片段着色器中直接访问。
5.深度缓冲的深度值范围为[0.0,1.0]. 转换方程为非线性。在z值很小的时候提供非常高的精度,而在z值很远的时候提供更少的精度。
near和far 为投影矩阵平截投体的近距离和远距离。这可能就是near设置为0的时候就啥都看不到的原因了(留坑待填,不懂留言)
操作:
1.开启深度测试
描述: 开启后图形绘制会自动丢掉遮挡的物体。(物体被挡住就看不见了的效果)
(1)启用深度测试 glEnable(GL_DEPTH_TEST);
(2)渲染后每次清空深度缓冲 glClear(GL_DEPTH_BUFFER_BIT);
2.只读深度缓冲
描述:你需要对所有片段都执行深度测试并丢弃相应的片段,但不希望更新深度缓冲
(1)设置它的深度掩码(Depth Mask)为GL_FALSE glDepthMask(GL_FALSE);
3.修改深度测试中使用的比较运算符
描述:控制OpenGL什么时候该通过或丢弃一个片段,什么时候去更新深度缓冲
(1)调用glDepthFunc()来设置比较运算符 如glDepthFunc(GL_LESS);
可接受的参数如下:
GL_ALWAYS 永远通过深度测试
GL_NEVER 永远不通过深度测试
GL_LESS 在片段深度值小于缓冲的深度值时通过测试
GL_EQUAL 在片段深度值等于缓冲区的深度值时通过测试
GL_LEQUAL 在片段深度值小于等于缓冲区的深度值时通过测试
GL_GREATER 在片段深度值大于缓冲区的深度值时通过测试
GL_NOTEQUAL 在片段深度值不等于缓冲区的深度值时通过测试
GL_GEQUAL 在片段深度值大于等于缓冲区的深度值时通过测试
默认为GL_LESS 也就是默认为前面的物体挡住后面
4.减轻或者完全避免深度冲突
描述:在放置物体的时候有时我们会让物体和另一个物体相邻放置。这样会导致接触面的深度值一样导致深度冲突。
(1)第一个也是最重要的技巧是永远不要把多个物体摆得太靠近,以至于它们的一些三角形会重叠(= v =!)。
(2)第二个技巧是尽可能将近平面设置远一些。根据要点:5的公式可以看出在接近near平面时缓冲值的精度比较高。但是使用这种方法会导致近处物体被裁剪掉!
(3)使用更高精度的深度缓冲。在大部分的系统中,深度缓冲的精度都是24位的。但是大部分显卡支持32位。这样会大幅提高精度,也会消耗更多的性能。