Opengl笔记---深度测试

主要是学习过程中的要点总结,学习渠道为: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位。这样会大幅提高精度,也会消耗更多的性能。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值