0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenGL中的深度、深度缓存、深度测试

Dbwd_Imgtec 来源:未知 作者:李倩 2018-07-05 16:49 次阅读

1、深度

所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离。摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机。

2、深度缓冲区

深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。

首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。

然后,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。

其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值<原先像素深度值,则新像素值会取代原先的;反之,新像素值被遮挡,他颜色值和深度将被丢弃。

为了启动深度缓冲区,必须先启动它,即glEnable(GL_DEPTH_TEST)。每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体。

数学基础:

待渲染的照相机空间中的深度经常定义为近距 near 到远距 far 之间的 z 值,Z坐标和X、Y坐标一样。在变换、裁减和透视除法后,Z的范围为-1.0~1.0。DepthRange映射指定Z坐标的变换,这与用于将X和Y映射到窗口坐标的视口变换类似,在透视变换之后,得到新的 z' 值:

其中 z 是照相机空间的值,它有时候也表示为 w 或者 w'。

结果 z' 是在 -1 到 1 之间归一化之后的值,其中近距 near 平面位于 -1 处,远距 far 平面位于 1 处。在这个范围之外的相应点在视图体之外,不需要进行渲染。

为了实现深度缓冲,在整个屏幕空间上的对当前多边形顶点之间进行插值来计算 z' 的值,通常这些中间数值在深度缓冲区中用定点数格式保存。距离近距 near 平面越近,z' 值越密;距离越远,z' 值越稀。这样距离照相机越近精度越高。near 平面距离照相机越近,则远距离位置的精度越低。near 平面距离照相机太近是在远距离物体产生人为误差的一个常见因素。

3、深度测试

OpenGL中的深度测试是采用深度缓存器算法,消除场景中的不可见面。在默认情况下,深度缓存中深度值的范围在0.0到1.0之间,这个范围值可以通过函数:glDepthRange (nearNormDepth, farNormalDepth);将深度值的范围变为nearNormDepth到farNormalDepth之间。这里nearNormDepth和farNormalDepth可以取0.0到1.0范围内的任意值,甚至可以让nearNormDepth > farNormalDepth。这样,通过glDepthRange函数可以在透视投影有限观察空间中的任意区域进行深度测试。

另一个非常有用的函数是:glClearDepth (maxDepth);参数maxDepth可以是0.0到1.0范围内的任意值。glClearDepth用maxDepth对深度缓存进行初始化,而默认情况下,深度缓存用1.0进行初始化。由于在进行深度测试中,大于深度缓存初始值的多边形都不会被绘制,因此glClearDepth函数可以用来加速深度测试处理。这里需要注意的是指定了深度缓存的初始化值之后,应调用: glClear(GL_DEPTH_BUFFER_BIT); 完成深度缓存的初始化。

在深度测试中,默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。这种比较测试的方式可以通过函数:glDepthFunc(func);进行修改。其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。这些测试可以在各种应用中减少深度缓存处理的的计算。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenGL
    +关注

    关注

    1

    文章

    85

    浏览量

    29243
  • 缓存器
    +关注

    关注

    0

    文章

    63

    浏览量

    11658

原文标题:OpenGL中的深度、深度缓存、深度测试

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    谈谈深度无盘缓存工具设置技巧

    。经过本人这段时间一直在实际环境测试深度无盘服务端自带的IO读缓存深度无盘缓存工具,发现这两
    发表于 07-15 13:24

    分享用深度无盘做的单包启动的6种不同配置客户机

    ,这个速度还是不错的。经过本人反复测试,发现集成到IO里面的读缓存没有深度缓存工具里面读缓存效果好,深度
    发表于 07-15 14:39

    浅谈示波器的存储深度

    1MHz),这对于我们选择示波器带宽来说300MHz的示波器带宽相对于几百KHz的电源开关频率来说已经足够,但很多时候我们却忽略了对采样率和存储深度的选择.比如说在常见的开关电源的测试,电压开关的频率一般
    发表于 05-07 10:46

    浅谈示波器的存储深度

    二进制波形信息存储到示波器的高速CMOS内存,就是示波器的存储,这个过程是“写过程”。内存的容量(存储深度)是很重要的。对于DSO,其最大存储深度是一定的,但是在实际测试中所使用的存
    发表于 08-10 16:02

    FPGA的最大深度

    被用作系统的缓冲元件或队列。因此FIFO的大小基本上暗示了所需缓存数据的容量,该容量取决于读写数据的速率。FIFO深度计算=B-B*F2/(F1*I), B为突发数据块大小
    发表于 05-28 14:17

    Nanopi深度学习之路(1)深度学习框架分析

    学习,也就是现在最流行的深度学习领域,关注论坛的朋友应该看到了,开发板试用活动中有【NanoPi K1 Plus试用】的申请,介绍NanopiK1plus的高大上优点之一就是“可运行深度学习算法的智能
    发表于 06-04 22:32

    深度学习的图片如何增强

    深度学习的图片增强
    发表于 05-28 07:03

    深度学习的IoU概念

    深度学习的IoU概念理解
    发表于 05-29 09:24

    深度学习DeepLearning实战

    测试)三、主讲内容1:课程一、强化学习简介课程二、强化学习基础课程三、深度强化学习基础课程四、多智能体深度强化学习课程五、多任务深度强化学习课程六、强化学习应用课程七、仿真实验课程八、
    发表于 01-09 17:01

    深度学习在预测和健康管理的应用

    深度学习在预测和健康管理的应用综述摘要深度学习对预测和健康管理(PHM)引起了浓厚的兴趣,因为它具有强大的表示能力,自动化的功能学习能力以及解决复杂问题的一流性能。本文调查了使用深度
    发表于 07-12 06:46

    EDX与XPS测试时采样深度的差别?

    XPS采样深度为2-5nm,EDS采样深度大约为1um,对于不同采样深度有区别,金属样品采样深度较浅。苏试宜特实验室提供解答
    发表于 09-30 18:36

    深度学习存在哪些问题?

    深度学习常用模型有哪些?深度学习常用软件工具及平台有哪些?深度学习存在哪些问题?
    发表于 10-14 08:20

    什么是深度学习?使用FPGA进行深度学习的好处?

    什么是深度学习为了解释深度学习,有必要了解神经网络。神经网络是一种模拟人脑的神经元和神经网络的计算模型。作为具体示例,让我们考虑一个输入图像并识别图像对象类别的示例。这个例子对应机器学习
    发表于 02-17 16:56

    渲染的帧缓存深度缓存

    渲染涉及大量的缓存,这里缓存只是一个简单的存有像素数据的矩形内存块,最重要缓存是帧缓存深度缓存
    的头像 发表于 05-14 11:44 6336次阅读
    渲染<b class='flag-5'>中</b>的帧<b class='flag-5'>缓存</b>和<b class='flag-5'>深度</b><b class='flag-5'>缓存</b>

    如何通过MEC构造基于深度学习的自动驾驶汽车缓存

    本文通过使用部署在多接入边缘计算(MEC)结构上的深度学习方法,为自动驾驶汽车提出了基于深度学习的缓存。通过仿真测试,结果发现该方法可以最大限度地减少延迟。
    的头像 发表于 10-10 09:26 4531次阅读