二. OpenGL - 深度测试

24 篇文章 0 订阅
22 篇文章 0 订阅

我们使用的是Z-buffer方法,也叫深度缓冲区Depth-buffer。
深度缓冲区(Detph buffer)同颜色缓冲区(color buffer)是对应的,颜色缓冲区存储的像素的颜色信息,而深度缓冲区存储像素的深度信息。
在决定是否绘制一个物体的表面时,首先将表面对应像素的深度值与当前深度缓冲区中的值进行比较,如果大于等于深度缓冲区中值,则丢弃这部分;否则利用这个像素对应的深度值和颜色值,分别更新深度缓冲区和颜色缓冲区。这一过程称之为深度测试(Depth Testing)。

什么是深度?

所谓的深度,就是坐标系中,像素Z坐标距离 观察者的距离。
观察者可以是任何位置。
OpenGL 会有专门一块缓存区来存放Z值,称为深度缓冲区。

深度缓冲区的作用?

一般情况下,我们绘制图形的时候,后面绘制的会把前面的图像覆盖掉,所以一般绘制顺序是先后面再前面。
产生一个性能问题就是遮盖的部分,如果先绘制前面的,这就产生被遮盖的部分没有任何意义的绘制。
深度缓冲区就是用来解决这个问题。

深度缓冲区解决覆盖绘制问题原理?

有了深度缓冲区后,绘制的时候就会检查像素点的Z值,靠近观察点的位置绘制,覆盖原理观察者的,不对其进行绘制。

如何使用深度缓冲区测试?

为什么要测试?一旦开启之后,就会先测深度值再进行绘制。
glEnable(GLDEPTHTEST) 用于开启深度测试的函数。
默认情况下,Z值小的情况下会被覆盖。
如果观察者在Z轴正方向,Z值越大越靠近观察者。
如果观察者在Z轴负方向,Z值小的靠近观察者。

如何解决深度值相同,造成的冲突问题?

  • 第一种方案:
    在第二次绘制时候,稍微偏移一点点解决这个问题,但是需要注意Z值的间隙。避免出现悬浮的风险。
  • 第二种方案:
    采用glPloygonOffset函数,使得可以调节片段的深度值,使得深度值偏移而不产生悬浮。

预防ZFighting的方法

  • 不要将两个物体靠的太近,避免渲染时三角形叠在一起。这种方式要求对场景中物体插入一个少量的偏移,那么就可能避免ZFighting现象。例如上面的立方体和平面问题中,将平面下移0.001f就可以解决这个问题。当然手动去插入这个小的偏移是要付出代价的。
  • 尽可能将近裁剪面设置得离观察者远一些。上面我们看到,在近裁剪平面附近,深度的精确度是很高的,因此尽可能让近裁剪面远一些的话,会使整个裁剪范围内的精确度变高一些。但是这种方式会使离观察者较近的物体被裁减掉,因此需要调试好裁剪面参数。
  • 使用更高位数的深度缓冲区,通常使用的深度缓冲区是24位的,现在有一些硬件使用使用32位的缓冲区,使精确度得到提高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值