openGL 深度格式 深度测试

openGL 深度格式 深度测试

penGL里常出现深度测试,一直不清楚。今天就来弄清楚。

(1)什么是深度?

深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!

深度值(Z值)越大,则离摄像机越远。

深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。

(2)为什么需要深度?

在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。

实际上,只要存在深度缓冲区,无论是否启用深度测试,OpenGL在像素被绘制时都会尝试将深度数据写入到缓冲区内,除非调用了glDepthMask(GL_FALSE)来禁止写入。这些深度数据除了用于常规的测试外,还可以有一些有趣的用途,比如绘制阴影等等。

(2)启用深度测试

使用 glEnable(GL_DEPTH_TEST);

在默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。

但是可以使用glDepthFunc(func)来对这种默认测试方式进行修改。

其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。

一般来将,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。

(3)启用了深度测试,那么这就不适用于同时绘制不透明物体。

备注:

绘制半透明物体时,需注意:在绘制半透明物体时前,还需要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了。

相关手记

365体育投注网站 淘宝怎么确认收货和评价?后面还可以退货吗?
365体育投注网站 如何调节屏幕色温和亮度
365体育投注网站 全网最全的二手书交易网站盘点!看这一个就够了!~
365bet投注网 腾讯应用宝怎么更新软件 应用宝更新软件方法
365bet线上网址 悄的意思,悄的解释,悄的拼音,悄的部首,悄的笔顺
365bet线上网址 2023年世界杯预选赛:谁能夺得最后入场券?