五、OpenGL深度测试理解

 我来答
科创17
2022-07-18 · TA获得超过5929个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:178万
展开全部

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

和帧缓冲区一样,就是一块内存区域(显存中)。专门存储每个像素点(绘制在屏幕上的)的深度值,和素点一一对应,每个像素点在深度缓冲区对应存储一个深度值。

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

深度缓冲区和颜⾊缓存区是对应的,颜⾊缓存区存储像素的颜⾊信息,⽽深度 缓冲区存储像素的深度信息。当我们之后要绘制一个物体表面的时候,首先会将表面像素点的深度与当前深度缓存区对应的深度进行比较,如果是大于深度缓存区对应的深度,则丢弃这部分值;否则的话,则使用当前像素点的颜色和深度更新颜色缓存区和深度缓存区。而这个丢弃和比较的过程,就是 深度测试

打开与关闭

规则修改

深度测试也同样存在着问题: ZFighting
开启深度测试之后,前后覆盖的问题得到了解决。但是由于精度的限制,对于相差非常小的深度值来说(例如在两个物体在深度上相互交叉),OpenGL可能会出现无法正确判断深度值的情况,从而导致测试结果随机出现,造成了画面交替显示,产生闪烁的问题。这就是Z-Fighting闪烁问题。如下图

目前OpenGL对Z-Fighting闪烁问题提供了一个解决方案,那就是多边形偏移( Polygon Offset)

另外还可指定偏移量

两个参数的计算方式为:

m : 多边形的深度的斜率的最⼤值,一个多边形越是与近裁剪面平行 m 就越接近于0。
r : 能产生于窗⼝坐标系的深度值中可分辨的差异最⼩值。 r 具体是由 OpenGL 平台指定的 ⼀个常量。
一个大于0的 Offset 会把模型推到离你(摄像机)更远的位置,相应的⼀个小于0的 Offset 会把模型拉近。
一般⽽言,只需要将 -1.0 和 -1 这样简单赋值给 glPolygonOffset 基本可以满⾜需求。

ZFlighting问题在绘制时也可以尽可能的去避免:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
富港检测东莞有限公司
2024-12-25 广告
ISTA3L是一个基于研究、数据驱动的测试协议,它模拟了由零售公司完成的产品订单被直接运送给消费者时所经历的危险,它允许用户评估包装产品的能力,以承受运输和处理包装产品时所经历的供应链危险,从接收到任何电子商务零售商履行操作,直到最终消费者... 点击进入详情页
本回答由富港检测东莞有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式