OpenGL(七)-图形图像渲染中的深度缓冲区

logo.jpg

什么是深度?

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

什么是深度缓冲区?

** 深度缓存区**,就是⼀块内存区域,专门存储着每个像素点(绘制在屏幕上的)深度值.深度值(Z值)越⼤大, 则离摄像机就越远.

为什么需要深度缓冲区?

在不使用深度测试的时候,如果我们先绘制一个距离比较近的物理理,再绘制距离较远的物体,则距离 远的位图因为后绘制,会把距离近的物体覆盖掉. 有了深度缓冲区后,绘制物体的顺序就不那么重要. 实际上,只要存在深度缓冲区,OpenGL 都会把像素的深度值写入到缓冲区中. 除⾮调⽤ glDepthMask(GL_FALSE).来禁⽌写⼊。

深度测试

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

深度值计算

深度值⼀一般由16位,24位或者32位表示,通常是24位。位数越高的话,深度的精确度越 好。深度值的范围在[0,1]之间,值越小表示越靠近观察者,值越大表示远离观察者。 深度缓冲主要是通过计算深度值来比较⼤小,在深度缓冲区中包含深度值介于0.0和1.0之间, 从观察者看到其内容与场景中的所有对象的 z 值进行了比较。这些视图空间中的 z 值可以在投影平头截体的近平面和远平面之间的任何值。我们因此需要⼀些⽅法来转换这些视图空间 z 值 到 [0,1] 的范围内,下面的 (线性) 方程把 z 值转换为 0.0 和 1.0 之间的值 :

71720E07A390A1A88739EDA4E61D1474.png

farnear是提供到投影矩阵设置可见视图截锥的远近值

深度测试的使用

深度缓冲区,一般由窗口管理理系统,GLFW创建.
开启深度测试

glEnable(GL_DEPTH_TEST);

在绘制场景前,清除颜⾊缓存区,深度缓冲

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

清除深度缓冲区默认值为1.0,表示最大的深度值,深度值的范围为(0,1)之间. 值越⼩表示越靠近观察者,值越⼤表示越远离观察者

指定深度测试判断模式

void glDepthFunc(GLEnum mode);
BA26B9DB79B198F098C5B335568E9356.png

打开/阻断深度缓存区写入

void glDepthMask(GLBool value);

value : GL_TURE 开启深度缓冲区写入; GL_FALSE 关闭深度缓冲区写⼊

你可能感兴趣的:(OpenGL(七)-图形图像渲染中的深度缓冲区)