美文网首页
OpenGL 深度测试

OpenGL 深度测试

作者: 番茄炒西红柿啊 | 来源:发表于2020-07-16 14:42 被阅读0次

正背面剔除遗留问题


进行了背面剔除之后,当旋转到侧边时,出现了缺口的现象. 图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:关闭

最终效果

相关文章

  • OpenGL:背面剔除和深度测试

    OpenGL:背面剔除和深度测试

  • 六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合

    OpenGL + OpenGL ES +Metal 系列文章汇总 深度测试 在上一篇五、OpenGL 渲染技巧:正...

  • 13. opengl高级-深度测试

    1. opengl深度测试原理,“测试”理解为“检测规则”更容易懂 关闭深度测试,后绘制的团会覆盖先绘制的纹理: ...

  • OpenGL 深度测试

    什么叫深度? 所谓深度,就在坐标系中,像素Z坐标距离观察者的距离.观察者,可以在任何位置.OpenGL 会有专门有...

  • OpenGL 深度测试

    正背面剔除遗留问题 进行了背面剔除之后,当旋转到侧边时,出现了缺口的现象. 当环旋转到侧边时观察者和环的关系如上图...

  • OpenGL深度测试

    一、概念 深度:深度其实就是该像素点在3D世界中距离摄像机的距离,Z值。 深度缓冲区:深度缓存区,就是一块内存区域...

  • OpenGL深度测试

    在上一篇OpenGL正背面剔除中提到了正背面剔除的弊端:如果前后两个点都是正面或是背面,这时OpenGL无法区分哪...

  • OpenGL 深度测试

    OpenGL 在绘制三维立体图形时, 如果不做处理, 就会产生一些不符合常理或者逻辑问题, 本次讲述被遮挡面显示...

  • OpenGL中ZFighting、颜色混合

    接上篇OpenGL深度测试已经明白处理前后重叠造成缺口问题的解决方案是使用深度测试 glEnable(GL_DEP...

  • NDK OpenGLES3.0 开发(十):深度测试

    该原创文章首发于微信公众号:字节流动 深度测试 OpenGL 深度测试是指在片段着色器执行之后,利用深度缓冲所保存...

网友评论

      本文标题:OpenGL 深度测试

      本文链接:https://www.haomeiwen.com/subject/qscphktx.html