【Unity3D】远处的物体会闪烁问题(深度冲突) Reversed-Z

知识点:深度冲突、像素闪烁现象、Reversed-Z(反向Z)、浮点数精度问题

前提概要:深度值都是由32位浮点数存储

原因:深度冲突,多个物体之间无法正确地渲染远近关系,出现上一帧可能是A物体在B物体前面,下一帧则反过来是B物体在A物体前面,每帧的这种远近关系情况都会变化情况下,就会产生闪烁表现。

问题1:为什么多个物体之间有明确的深度值却在计算机里无法得到正确的远近关系?

因为深度值是浮点类型float32,其浮点数记录无法保证精确度的,它仅有23个二进制有效位保存数据,8位是指数位,1位是符号位,其中23位只是小数有效位,若只谈纯整数它有24位有效位,2^24代表16777216个整数,例如:1.1111111....111  小数点后面是23个1,指数是2^23,那么就会得到 11111111...1111 (24个1)的二进制数,这个最前面的1是默认存在的(IEEE754规范)

具体浮点数精度问题解释:【Unity3d】C#浮点数丢失精度问题_c#double精度-CSDN博客

答案:由于无法有足够的精度准确表达出浮点数深度值,所以深度相近的2个物体可能会发生闪烁。

注意并不是只有远处的物体会发生闪烁,只要2个深度相近到计算机无法用浮点数精确表达的数值,那么就会发生不准确而闪烁。

问题2:那么为什么远处的物体更容易引发闪烁现象?而近处的物体只要不是靠的特别近(非重叠)都很难发生闪烁现象【本文重点】

答案:由于我们的深度值是由32位浮点数存储,浮点数的存储结构决定了它的性质是越大的浮点数它的精度越小,越小的浮点数它的精度越大;精度是指有效小数位数的数量。

为什么有这个性质?(数值越小精度越大,数值越大精度越小)

很简单的道理,当浮点数整数越大时,浮点数整数部分占据23位有效二进制位越多,自然留给浮点数小数部分的有效二进制位就越少,自然精度越小;反之当你浮点数整数越小时,整数部分占据23位有效二进制越少,自然留给小数部分的有效二进制位就越多,自然精度越大。

Reversed-Z 反向Z原理为什么可以降低发生闪烁的现象概率?

想避免远处物体闪烁,就得提高远处物体的深度值存储精度,1是用更多二进制位去存储深度,2是利用浮点数(数值越小精度越大,数值越大精度越小)性质去改善深度精度情况,采用2方案则是利用Reversed-Z技术,具体介绍参考如下文章

反向Z(Reversed-Z)的深度缓冲原理

在看完上篇文章之后大概会有个了解就是摄像机NDC归一化之后的远平面深度为0,近平面深度为1。(正常是近平面是0,远平面是1)

上面2张图,左图(Y轴是View深度,X轴是反向的NDC深度)红点代表有效数值标记,越密集代表越多有效值(精度高),反之精度低。右图(Y轴是精度程度,X轴是View深度)

无论左图还是右图都要以View Space Depth(View深度)为主轴看;
例如,左图Y轴[80,100]范围,其红色点密集,代表深度大的物体能准确表达深度;其他范围同理,然后你会发现Y轴[0,5]之类的近处小范围它的红点疏散,实际上看似很少红点,当右图统计[0,20]都有着不错的准确性,可能作者没有取更精确的刻度,或许[0,5]的精度会变少,但反向Z技术保证了[5,100]的范围精度是可靠的,即保证大部分深度范围的物体不会闪烁,小部分范围闪烁,相比较之前的情况要好。

原文将near和far数值继续拉大到10000单位,主要看右图,远处的精度变小了,近处的精度明显变大,但整体上来看,中、远距离的物体精度仍然有所保证,它们的远近关系仍然可以比较不错的表达出来,而降低闪烁现象。

下面这张是未使用反向Z之前的效果,可看到远处物体的精度几乎是接近0,代表远处物体的深度无法正常准确表达,会大概率发生闪烁现象。

可以尝试复刻原文,画出更精确刻度的右图来获得反向Z后的不同距离的物体深度精度情况。

注意:OpenGL NDC是(-1,1)范围的,所以无法利用浮点数性质,因为远平面和近平面都是趋近于1,而非0,也就只有中间的物体它的精度值是很高的...尬住了

好像Unity在DirectX平台下默认帮我们处理Reversed-Z,但OpenGL则不会了,具体如何避免闪烁,大多数做法就是把Near拉大,就能改善不少,缺点是摄像机到近平面距离的物体看不到了。其次就是隐藏或裁剪掉远距离的物体了,好像没啥办法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

彻底理解JVM类加载机制

文章目录 一、类加载器和双亲委派机制1.1、类加载器1.2、双亲委派机制1.3、自定义类加载器1.4、打破双亲委派机制 二、类的加载 图片来源:图灵学院   由上图可知,创建对象,执行其中的方法,在java层面,最重要的有获取…

【2024年华为OD机试】 (A卷,200分)- 快递投放问题(Java JS PythonC/C++)

一、问题描述 题目解析 题目描述 有 N 个快递站点用字符串标识,某些站点之间有道路连接。每个站点有一些包裹要运输,每个站点间的包裹不重复。路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递。 输入描述 第一行输入 M N&…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息,现整理如下: 功能描述:获取淘宝搜索页面的信息,提取其中的商品名称和价格 探讨:淘宝的搜索接口 翻页的处理 技术路线:requests…

【大数据】机器学习------支持向量机(SVM)

支持向量机的基本概念和数学公式: 1. 线性可分的支持向量机 对于线性可分的数据集 ,其中(x_i \in R^d) 是特征向量 是类别标签,目标是找到一个超平面 ,使得对于所有 的样本 ,对于所有(y_i -1) 的样本,…

服务器数据恢复—EMC存储POOL中数据卷被删除的数据恢复案例

服务器数据恢复环境&故障: EMC Unity 400存储连接了2台硬盘柜。2台硬盘柜上一共有21块硬盘(520字节)。21块盘组建了2组RAID6:一组有11块硬盘,一组有10块硬盘。 在存储运行过程中,管理员误操作删除了 2组…

Ubuntu系统备份与还原

Ubuntu系统备份与还原 前言ClonezillaTimeshift安装图形界面使用命令行使用 前言 Linux系统备份软件有Clonezilla和TimeShift。 使用Clonezilla需要准备USB启动盘,而Timeshift不需要。 因此推荐使用Timeshift进行备份与还原。 Clonezilla 官网:https:…

CSS:语法、样式表、选择器

目录 一、语法 二、创建 外部样式表 内部样式表 内联样式 三、选择器 ID选择器 类选择器 伪类选择器 :hover a:link a:active a:visited 属性选择器 伪元素选择器 ::first-letter ::first-line ::selection ::placeholder ::before 和::after 通配选择器 标…

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…

YOLOv5训练长方形图像详解

文章目录 YOLOv5训练长方形图像详解一、引言二、数据集准备1、创建文件夹结构2、标注图像3、生成标注文件 三、配置文件1、创建数据集配置文件2、选择模型配置文件 四、训练模型1、修改训练参数2、开始训练 五、使用示例1、测试模型2、评估模型 六、总结 YOLOv5训练长方形图像详…

“AI智能防控识别系统:守护安全的“智慧卫士”

在如今这个科技飞速发展的时代,安全问题始终是大家关注的焦点。无论是企业园区、学校校园,还是居民社区,都希望能有一双“慧眼”时刻守护着,及时发现并防范各种安全隐患。而AI智能防控识别系统,就像一位不知疲倦、精准…

使用FFmpeg和Python将短视频转换为GIF的使用指南

使用FFmpeg和Python将短视频转换为GIF的使用指南 在数字时代,GIF动图已成为表达情感和分享幽默的重要媒介。无论是社交媒体上的搞笑片段还是创意项目中的视觉效果,GIF都能迅速抓住观众的注意力。然而,很多人不知道如何将短视频转换为GIF。本…

黑马Java面试教程_P1_导学与准备篇

系列博客目录 文章目录 系列博客目录导学Why?举例 准备篇企业是如何筛选简历的(筛选简历的规则)HR如何筛选简历部门负责人筛选简历 简历注意事项简历整体结构个人技能该如何描述项目该如何描述 应届生该如何找到合适的练手项目项目来源找到项目后,如何深入学习项目…

【前端动效】HTML + CSS 实现打字机效果

目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示,这次带来的是一个有趣的“擦除”效果,也可以叫做打字机效果,其中一段文本从左到右逐渐从…

C#学习笔记 --- 基础补充

1.operator 运算符重载:使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类: 同名方法写在不同位置,可以当成一个类使用。 3.索引器:使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了,欢迎广大GISer朋友关注,一起探索GIS奥秘,分享GIS价值! 本专栏以实战案例的形式,深入浅出地介绍了GRASS GIS的基本使用方法,用一个个实例讲…

当当网书籍信息爬虫

1.基本理论 1.1概念体系 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以按照我们设置的规则自动化爬取网络上的信息,这些规则被称为爬虫算法。是一种自动化程序,用于从互联网上抓取数据。爬虫通过模拟浏览器的行为,访问网页…

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张:A4→页边距:上下左右边距→文档网格:只指定行网格→版式:页眉和页脚:页脚距边界:1.4cm居中设置论文页码:插入…

RabbitMQ实现延迟消息发送——实战篇

在项目中,我们经常需要使用消息队列来实现延迟任务,本篇文章就向各位介绍使用RabbitMQ如何实现延迟消息发送,由于是实战篇,所以不会讲太多理论的知识,还不太理解的可以先看看MQ的延迟消息的一个实现原理再来看这篇文章…

【PCL】Segmentation 模块—— 欧几里得聚类提取(Euclidean Cluster Extraction)

1、简介 PCL 的 Euclidean Cluster Extraction(欧几里得聚类提取) 是一种基于欧几里得距离的点云聚类算法。它的目标是将点云数据分割成多个独立的簇(clusters),每个簇代表一个独立的物体或结构。该算法通过计算点与点…

ElasticSearch上

安装ElasticSearch Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用Ela…