当前位置: 首页 > news >正文

【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拉大,就能改善不少,缺点是摄像机到近平面距离的物体看不到了。其次就是隐藏或裁剪掉远距离的物体了,好像没啥办法。

相关文章:

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

知识点:深度冲突、像素闪烁现象、Reversed-Z(反向Z)、浮点数精度问题 前提概要:深度值都是由32位浮点数存储 原因:深度冲突,多个物体之间无法正确地渲染远近关系,出现上一帧可能是A物体在B物体…...

探索与创作:2024年CSDN平台上的成长与突破

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…...

QT笔记- Qt6.8.1 Android编程 添加AndroidManifest.xml文件以支持修改权限

1. 切换项目选项卡,找到构建的步骤下的最后一项构建安卓APK,展开后找到应用程序栏,点击安卓自定义中的创建模板. 2. 弹出对话框勾选图中选项后点完成 3. 回到项目,查看.pro文件,里面多了很多内容不管,在下…...

【Leetcode 每日一题 - 扩展】421. 数组中两个数的最大异或值

问题背景 给你一个整数数组 n u m s nums nums&#xff0c;返回 n u m s [ i ] X O R n u m s [ j ] nums[i]\ XOR\ nums[j] nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 0 ≤ i ≤ j < n 0≤i≤j<n。 数据约束 1 ≤ n u m s . l e n g…...

计算机网络 | IP地址、子网掩码、网络地址、主机地址计算方式详解

关注&#xff1a;CodingTechWork 引言 在计算机网络中&#xff0c;IP地址、子网掩码和网络地址是构建网络通信的基本元素。无论是企业网络架构、互联网连接&#xff0c;还是局域网&#xff08;LAN&#xff09;配置&#xff0c;它们都起着至关重要的作用。理解它们的工作原理&a…...

C#如何调用执行命令行窗口(CMD)

一、引言 在 C# 的编程世界里&#xff0c;我们常常会遇到需要与操作系统底层进行交互的场景。这时&#xff0c;调用命令行窗口&#xff08;CMD&#xff09;就成为了一个强大的工具。无论是自动化日常任务&#xff0c;还是执行外部程序和批处理文件&#xff0c;通过 C# 调用 CM…...

vim练级攻略(精简版)

vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格&#xff0c;tab&am…...

一文速通Java的JDBC编程

目录 &#x1f43d;JDBC的引入 什么是API JDBC的概念及作用 &#x1f347;准备工作 数据库驱动包 下载第三方库 &#x1f43e;JDBC 使用 将jar包导入项目 通过代码使用JDBC的API (1)创建数据源对象并设置属性 (2)和数据库服务器建立网络连接 (3)程序构造SQL语句 (…...

laravel中请求失败重试的扩展--Guzzle

背景 开发过程中&#xff0c;跟外部接口对接时&#xff0c;很常见的要考虑到失败重新的情况&#xff0c;这里记录一下我用的失败重试的情况&#xff0c; 重试方法 1、使用 Laravel 的 HTTP 客户端和异常处理 结合异常处理和重试逻辑 use Illuminate\Support\Facades\Http;…...

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…...

Mysql MVCC

MVCC 什么是MVCC MVCC&#xff08;多版本并发控制&#xff0c;Multi-Version Concurrency Control&#xff09; 是一种用于数据库管理系统&#xff08;DBMS&#xff09;中的并发控制机制&#xff0c;它允许多个事务同时执行而不互相阻塞&#xff0c;并通过创建数据的多个版本…...

Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端

文章目录 一、概述二、使用1、创建接口HttpExchange方法2、创建一个在调用方法时执行请求的代理3、方法参数4、返回值5、错误处理&#xff08;1&#xff09;为RestClient&#xff08;2&#xff09;为WebClient&#xff08;3&#xff09;为RestTemplate 注意 一、概述 官方文档…...

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序

接下来编译 LED 驱动&#xff0c;该驱动用于在基于华为设备框架&#xff08;HDF&#xff09;的系统中控制 LED 灯的开关&#xff0c;完整代码如下所示&#xff1a; 更多内容可以关注&#xff1a;迅为RK3568开发板篇OpenHarmony...

[javaWeb]初识Web

将该图片在浏览器中打印出来 代码&#xff1a; <html> <head> <title>HTML初识</title> </head> <body> <h1>猫猫</h1> <img src "img/1.jpg"> </body> &l…...

复健第二天之[MoeCTF 2022]baby_file

打开题目在线环境可以看到&#xff1a; 感觉要用伪协议去求&#xff0c;但是我们并不知道flag的位置&#xff0c;这里我选择用dirsearch去扫一下&#xff1a; 最像的应该就是flag.php了 于是就构建payload&#xff1a; **?filephp://filter/convert.base64-encode/resource…...

uniapp 微信小程序 editor 富文本编辑器

<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...

SparkSQL函数

文章目录 1. SparkSQL函数概述2. SparkSQL内置函数2.1 常用内置函数分类2.2 常用数组函数2.2.1 array()函数1. 定义2. 语法3. 示例 2.3 常用日期与时间戳函数2.4 常见聚合函数2.5 常见窗口函数 3. SparkSQL自定义函数3.1 自定义函数分类3.2 自定义函数案例演示 1. SparkSQL函数…...

从零开始学数据库 day2 DML

从零开始学数据库&#xff1a;DML操作详解 在今天的数字化时代&#xff0c;数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用&#xff0c;还是想要管理复杂的数据&#xff0c;掌握数据库的基本操作都是至关重要的。在这篇博客中&#xff0c;我们将专注…...

电脑换固态硬盘

参考&#xff1a; https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种&#xff1a; 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜&#xff1a; M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...