5-1.深度测试

2020-09-28  本文已影响0人  Pufus

深度?

深度就是该像素点在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
上一篇 下一篇

猜你喜欢

热点阅读