美文网首页
5-1.深度测试

5-1.深度测试

作者: Pufus | 来源:发表于2020-09-28 09:41 被阅读0次

深度?

深度就是该像素点在3D世界中距离摄像机的距离,Z值


深度.png

观察者A距离A,B平面的距离都可以叫做为深度。观察者B距离B,A平面的距离都可以叫做深度。

深度缓冲区

深度缓存区就是一块内存区域,专⻔门存储着每个像素点(绘制在屏幕上的)深度值.深度值(Z值)越⼤大, 则离摄像机就越远.
其实它存储在显存中!
深度缓存区原理:
就是把距离观察者平面(近裁剪面)的深度值与窗口中的每个像素点1对1进行关联以及存储;
为什么需要深度缓冲区?
在不使⽤深度测试的时候,如果我们先绘制一个距离⽐较近的物体,再绘制距离较远的物体,则距离远的位图因为后绘制,会把距离近的物体覆盖掉. 有了深度缓冲区后,绘制物体的顺序就不那么􏰀重要的. 实际上只要存在深度缓冲区,OpenGL 都会把像素的深度值写入到缓冲区中. 除⾮调用 glDepthMask(GL_FALSE)来禁⽌止写入.


深度缓冲区解析.png

对于观察者A来说,在OpenGL绘制图形的时候,B页面是看不到的,它在Z轴上距离观察者A的距离(绿色线段)>A平面距离观察者的距离(蓝色线段),那么,距离观察者A近的就是A平面,则B平面像素&深度值将会被丢弃,A平面的像素深度值将会被存储到深度缓冲区,并绘制

深度缓冲区解析.png
对于观察者B来说,则是A平面的像素&深度值被丢弃,B平面像素深度值存在深度缓冲区并绘制

深度测试

深度缓冲区(DepthBuffer)和颜⾊色缓存区(ColorBuffer)是对应的.颜⾊色缓存区存储像素的颜⾊色信 息,而深度缓冲区存储像素的深度信息. 在决定是否绘制⼀个物体表面时, 首先要将表面对应的像素的深度值与当前深度缓冲区中的值进⾏⽐较. 如果大于深度缓冲区中的值,则丢弃这部分.否则利用这个像素对应的深度值和颜色值.分别更新深度缓冲区和颜⾊缓存区. 这个过程称为”深度测试”

开启深度测试也可以解决隐藏面消失的问题。

glEnable(GL_DEPTH_TEST);

我们可以通过修改glDepthFunc(GLenum func)来改变深度测试的规则


image.png

由此解决遮挡关系错误的现象。


甜甜圈开启深度测试.png

相关文章

  • 5-1.深度测试

    深度? 深度就是该像素点在3D世界中距离摄像机的距离,Z值 观察者A距离A,B平面的距离都可以叫做为深度。观察者B...

  • 九、OpenGL渲染技巧 - 深度测试&多边形偏移&裁剪&混合

    1. 深度测试 深度测试的目的是防止被其他面遮挡的面显示出来。开启深度测试后,会对新的片段进行测试,测试通过的片段...

  • OpenGL-10-渲染技巧:深度测试、多边形偏移、颜色混合

    上篇文章提到了 深度测试 可以解决隐藏面消除。这次来深入理解一下深度测试,以及深度测试带来的问题和解决方法:多边形...

  • 【六十四,高级OpenGL-01深度测试】

    深度测试 深度测试(Depth Buffer)防止被遮挡住的面渲染遮挡面的前面,它由窗口自动创建,深度值存储为16...

  • OpenGL渲染技巧

    深度测试 在之前我们已经讲过深度测试的大部分内容,这次就完善一下之前的内容。首先深度测试解决的问题:当我们绘制的图...

  • 13. opengl高级-深度测试

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

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

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

  • 深度测试

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

  • 2018-06-18

    深度覆盖测试-居民小区深度覆盖测试工具 一、简介 为便于测试、记录居民小区楼内覆盖情况,本程序提供了基于andro...

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

    OpenGL:背面剔除和深度测试

网友评论

      本文标题:5-1.深度测试

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