OpenGL 深度测试

192 篇文章 38 订阅

正背面剔除遗留问题


进行了背面剔除之后,当旋转到侧边时,出现了缺口的现象.

图1

当环旋转到侧边时观察者和环的关系如上图所示,此时a和b都是朝向观察者的,都是正面。但是剔除背面后,a和b距离观察者的距离是不同的,此时OpenGL不知到底应该显示哪个。就出现了缺口的现象。

深度

深度是指像素点的z坐标距离观察者的距离。

  • 当观察者在像素点Z轴正方向时,则像素点z值越大,深度值越小,越靠近观察者
  • 当观察者在像素点Z轴负方向时,则像素点z值越小,深度值越小,越靠近观察者

深度缓冲区

专门用来存储每个像素点深度值的内存区域

  • 存储值范围[0, 1], 默认值为最大值1。

深度测试

没有开启深度测试时,会先绘制距离较近的,再绘制距离较远的。这样就出现了后者覆盖前者的问题。正如环缺口问题。

开启深度测试后,一个物体在绘制时,会将像素点新的深度值与深度缓存中的深度值作比较,如果新值大于缓存中的值,则丢弃这部分不绘制。否则将新的深度值更新至深度缓存区中,深度缓存区与颜色缓存区是一一对应的,同时也需要更新该像素点的颜色值到颜色缓存区。

  • 开启深度测试

glEnable(GL_DEPTH_TEST);
  • 关闭深度测试

glDisable(GL_DEPTH_TEST);
  • 绘制需要清空深度缓冲区

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

拓展

  • 指定深度测试判断模式
    void glDepthFunc(GLEnum mode)

  • 打开/阻断深度缓冲区写入 void glDepthMask(GLBool value)
    value : GL_TURE:打开 GL_FALSE:关闭

最终效果



链接:https://www.jianshu.com/p/f9a726544344
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值