LearnOpenGL学习笔记——深度测试

本文详细介绍了OpenGL中的深度测试和深度缓冲工作原理,包括深度测试的启用、比较函数、深度值的非线性特性以及如何解决深度冲突问题。通过深度测试,可以正确处理物体间的遮挡关系,确保近处的物体遮挡远处的物体。深度缓冲的非线性处理提高了近处物体的深度精度,而线性化深度值则有助于在视觉上呈现线性深度变化。深度冲突(Z-fighting)可通过调整近平面、使用更高精度的深度缓冲或避免物体过于接近来避免。

什么是深度测试

我们在绘制物体的时候,物体之间是有遮挡关系的。比如下图,箱子遮挡住地面。遮挡关系是由深度确定的。从视觉上来讲,可以简单的理解为从摄像机(眼睛)看过去,距离摄像机(眼睛距离越近),深度值越小,越不会被遮挡。如下图:
在这里插入图片描述
OpenGL中,默认是禁用深度测试的,也就是说,OpengGL在绘制物体时候,并不关心哪个物体遮挡哪个物体。后绘制的物体总是遮挡前面的。如果不做深度测试,那我们上图的地面和箱子就变成了下图:
在这里插入图片描述

现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。 片段着色器通常开销都是很大的,所以我们应该尽可能避免运行它们。当使用提前深度测试时,片段着色器的一个限制是你不能写入片段的深度值。如果一个片段着色器对它的深度值进行了写入,提前深度测试是不可能的。OpenGL不能提前知道深度值。

深度测试函数

//深度测试默认是禁用的,所以如果要启用深度测试的话,我们需要用GL_DEPTH_TEST选项来启用它:
glEnable(GL_DEPTH_TEST);
//当它启用的时候,如果一个片段通过了深度测试的话,OpenGL会在深度缓冲中储存该片段的z值;如果没有通过深度缓冲,则会丢弃该片段
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//你启用了深度缓冲,你还应该在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则你会仍在使用上一次渲染迭代中的写入的深度值
//可以想象,在某些情况下你会需要对所有片段都执行深度测试并丢弃相应的片段,但不希望更新深度缓冲。基本上来说,你在使用一个只读的(Read-only
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值