Unity中URP下深度图的线性转化

文章目录

  • 前言
  • 一、_ZBufferParams参数有两组值
  • 二、LinearEyeDepth
    • 1、使用
    • 2、Unity源码推导:
    • 3、使用矩阵推导:
  • 三、Linear01Depth
    • 1、使用
    • 2、Unity源码推导
    • 3、数学推导:


前言

在之前的文章中,我们实现了对深度图的使用。因为,深度图不是线性的。所以,在使用时,我们使用了 Linear01Depth 函数对其进行了线性转化。

  • Unity中URP下开启和使用深度图

但是,对深度图进行线性转化 还有其他函数。

在这篇文章中,我们来看一下深度图线性转化的 Linear01Depth函数 和 LinearEyeDepth 函数 干了什么。


一、_ZBufferParams参数有两组值

  • 在OpenGL下
    在这里插入图片描述

  • 在类DirectX下
    在这里插入图片描述


二、LinearEyeDepth

1、使用

  • 对采样的深度图纹理进行线性转化
    在这里插入图片描述

  • 转化后的值,就是原来物体的深度 Z 值

float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);
float depthTex = LinearEyeDepth(cameraDepthTex,_ZBufferParams);

  • 返回结果全白,效果不明显
    请添加图片描述
  • 我们对其取小数部分,使其效果明显一点

frac(depthTex)

请添加图片描述

2、Unity源码推导:

在这里插入图片描述
在这里插入图片描述

  • 这里使用OpenGL下推导

Z v i e w = 1 1 − f n f d + f n f Z_{view}=\frac{1}{\frac{1-\frac{f}{n}}{f}d+\frac{\frac{f}{n}}{f}} Zview=f1nfd+fnf1

Z v i e w = 1 ( n n − f n ) 1 f d + 1 n Z_{view}=\frac{1}{(\frac{n}{n}-\frac{f}{n})\frac{1}{f}d+\frac{1}{n}} Zview=(nnnf)f1d+n11

Z v i e w = 1 ( n − f n ) 1 f d + 1 n Z_{view}=\frac{1}{(\frac{n-f}{n})\frac{1}{f}d+\frac{1}{n}} Zview=(nnf)f1d+n11

Z v i e w = 1 n − f n f d + 1 n Z_{view}=\frac{1}{\frac{n-f}{nf}d+\frac{1}{n}} Zview=nfnfd+n11

3、使用矩阵推导:

  • OpenGL
    [ 2 n w 0 0 0 0 2 n h 0 0 0 0 n + f n − f 2 n f n − f 0 0 − 1 0 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n+f}{n-f} &\frac{2nf}{n-f}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} w2n0000h2n0000nfn+f100nf2nf0

  • DirectX
    [ 2 n w 0 0 0 0 2 n h 0 0 0 0 n f − n n f f − n 0 0 − 1 0 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} w2n0000h2n0000fnn100fnnf0

  • 由观察空间转化到裁剪空间矩阵可得
    Z c l i p = n + f n − f Z v i e w + 2 n f n − f W v i e w Z_{clip}=\frac{n+f}{n-f}Z_{view}+\frac{2nf}{n-f}W_{view} Zclip=nfn+fZview+nf2nfWview
    W c l i p = − Z v i e w W_{clip}=-Z_{view} Wclip=Zview

  • 做透视除法可得
    Z n d c = Z c l i p W c l i p = n + f n − f Z v i e w + 2 n f n − f − Z v i e w = n + f f − n + 2 n f ( f − n ) Z v i e w Z_{ndc} = \frac{Z_{clip}}{W_{clip}} = \frac{\frac{n+f}{n-f}Z_{view}+\frac{2nf}{n-f}}{-Z_{view}}=\frac{n+f}{f-n}+\frac{2nf}{(f-n)Z_{view}} Zndc=WclipZclip=Zviewnfn+fZview+nf2nf=fnn+f+(fn)Zview2nf

  • d = 0.5 ⋅ Z n d c + 0.5 d=0.5·Z_{ndc}+0.5 d=0.5Zndc+0.5
    d = 0.5 ⋅ ( n + f f − n + 2 n f ( f − n ) Z v i e w ) + 0.5 d = 0.5·(\frac{n+f}{f-n}+\frac{2nf}{(f-n)Z_{view}})+0.5 d=0.5(fnn+f+(fn)Zview2nf)+0.5

  • 我们由 d d d 公式化简,即可得到 Z v i e w Z_{view} Zview
    Z v i e w = 1 f − n n f d − 1 n Z_{view} = \frac{1}{\frac{f-n}{nf}d-\frac{1}{n}} Zview=nffndn11

  • 为了得到正的Z值,需要取反
    Z v i e w = − 1 f − n n f d − 1 n Z_{view} =- \frac{1}{\frac{f-n}{nf}d-\frac{1}{n}} Zview=nffndn11
    Z v i e w = 1 n − f n f d + 1 n Z_{view}=\frac{1}{\frac{n-f}{nf}d+\frac{1}{n}} Zview=nfnfd+n11


三、Linear01Depth

1、使用

  • 对采样的深度图纹理进行线性转化
    在这里插入图片描述

  • 转化后的值,是Z值在[0,1]区间的值

float4 cameraDepthTex = SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);
float depthTex = Linear01Depth(cameraDepthTex,_ZBufferParams);

  • 返回结果
    请添加图片描述

2、Unity源码推导

在这里插入图片描述
、

  • OpenGL下推导:
    Z v i e w = 1 ( 1 − f n ) d + f n Z_{view}= \frac{1}{(1-\frac{f}{n})d+\frac{f}{n}} Zview=(1nf)d+nf1

3、数学推导:

  • 这是LinearEyeDepth下推导出来的
    Z v i e w = 1 n − f n f d + 1 n Z_{view}=\frac{1}{\frac{n-f}{nf}d+\frac{1}{n}} Zview=nfnfd+n11

  • Z v i e w Z_{view} Zview的取值范围 [ n e a r , f a r ] [near,far] [near,far]

  • 使其除以一个 f f f得到 Linear01Depth函数的结果
    Z v i e w = 1 n − f n f d + 1 n ⋅ 1 f = 1 n − f n f d f + f n = 1 ( 1 − f n ) d + f n Z_{view}=\frac{1}{\frac{n-f}{nf}d+\frac{1}{n}}·\frac{1}{f}=\frac{1}{\frac{n-f}{nf}df+\frac{f}{n}}=\frac{1}{(1-\frac{f}{n})d+\frac{f}{n}} Zview=nfnfd+n11f1=nfnfdf+nf1=(1nf)d+nf1

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《射雕三部曲》人物关系可视化及问答系统

背景: 该项目旨在构建一个基于图数据库和知识图谱的《射雕三部曲》人物关系可视化及问答系统。通过分析小说中的人物关系,将其构建成图数据库,并结合问答系统和数据分析技术,提供用户可视化的人物关系展示和相关问题的回答。 介绍…

zookeeper下载安装部署

zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目的一个子项目,并根据google发表的一篇论文来实现的。zookeeper为分布式系统提供了高效且易于使用的协同服务,它可以为分布式应用提供相当多的服务,诸如统一…

docker部署mongo过程

1、拉取MongoDB镜像,这里拉取最新版本。 docker pull mongo2、运行容器 docker run -d --name mongo -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:latest --auth#由于 mongodb 默认情况下,…

寒假前端第一次作业

1、用户注册&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户注册</title> …

Flink异步IO

本文讲解 Flink 用于访问外部数据存储的异步 I/O API。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于 Future 和事件驱动编程的知识。 本文代码gitee地址: https://gitee.com/ddxygq/BigDataTechnical/blob/main/Flink/src/main/java/operator/AsyncIODemo.java …

Java面试——框架篇

1、Spring框架中的单例bean是线程安全的吗&#xff1f; 所谓单例就是所有的请求都用一个对象来处理&#xff0c;而多例则指每个请求用一个新的对象来处理。 结论&#xff1a;线程不安全。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。一…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

多语言历史报纸广告事件抽取(ACL2023)

1、写作动机&#xff1a; 首先&#xff0c;获取大规模的、有注释的历史数据集是困难的&#xff0c;因为只有领域专家才能可靠地为它们打标签。其次&#xff0c;大多数现成的NLP模型是在现代语言文本上训练的&#xff0c;这使得它们在应用于历史语料库时效果显著降低。这对于研…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-4 CSS 立方体

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS 立方体</title> <link href"CSS/style.css" rel"stylesheet" type"text/css"> <style> .box {width: 200px…

【Docker】快速入门之Docker的安装及使用

一、引言 1、什么是Docker Docker是一个开源的应用容器引擎&#xff0c;它让开发者可以将他们的应用及其依赖打包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之…

滚柱导轨精度等级是如何划分?

滚柱导轨的精度等级主要根据其表面精度、滑块与导轨表面的公差以及定位精度等性能指标来划分。根据不同的标准和应用需求&#xff0c;精度等级的划分存在一定的差异。 1、行走平行度&#xff1a;普通级&#xff08;无标注/C&#xff09;5μm&#xff0c;高级&#xff08;H&…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

超维空间M1无人机使用说明书——41、ROS无人机使用yolo进行物体识别

引言&#xff1a;用于M1无人机使用的18.04系统&#xff0c;采用的opencv3.4.5版本&#xff0c;因此M1无人机只提供了基于yolov3和yolov4版本的darknet_ros功能包进行物体识别&#xff0c;识别效果足够满足日常的物体识别使用&#xff0c;如果需要更高版本的yolov7或者yolov8&am…

python tcp socket中实现SSL/TLS认证

SSL/TLS介绍 官话说SSL是安全套接层(secure sockets layer)&#xff0c;TLS是SSL的继任者&#xff0c;叫传输层安全(transport layer security)。 说白点&#xff0c;就是在明文的上层和TCP层之间加上一层加密&#xff0c;这样就保证上层信息传输的安全。如HTTP协议是明文传输…

大模型LLM Agent在 Text2SQL 应用上的实践

1.前言 在上篇文章中「如何通过Prompt优化Text2SQL的效果」介绍了基于Prompt Engineering来优化Text2SQL效果的实践&#xff0c;除此之外我们还可以使用Agent来优化大模型应用的效果。 本文将从以下4个方面探讨通过AI Agent来优化LLM的Text2SQL转换效果。 1 Agent概述2 Lang…

Flashduty 案例分享 - 途游游戏

Flashduty 作为功能完备的事件OnCall中心&#xff0c;可以接入云上、云下不同监控系统&#xff0c;统一做告警降噪分派、认领升级、排班协同&#xff0c;已经得到众多先进企业的认可。我们采访了一些典型客户代表&#xff0c;了解他们的痛点、选型考虑和未来展望&#xff0c;集…

烟火自动识别预警和监管系统 烟火检测识别系统---豌豆云

烟火自动识别预警和监管系统 烟火检测识别系统—豌豆云 烟火检测报警系统全自动对视频图象信息开展解析鉴别&#xff0c;不用人工控制;及时处理工地监控地区内烟雾、火焰&#xff0c;以更快、最好的形式开展预警信息。 合理的帮助管理者解决&#xff0c;并最大限度的减少乱报…

力扣hot100 二叉树的最近公共祖先 递归

Problem: 236. 二叉树的最近公共祖先 &#x1f468;‍&#x1f3eb; 参考大佬题解 &#x1f496; 图解 时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) &#x1f496; AC code /*** Definition for a binary tree node.*…

Linux网络编程(一-网络相关知识点)

目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信&#xff0c;任何数字通信都离…

微信小程序:flex常用布局

在我们平时微信小程序开发过程中为了页面能达到设计小伙伴的预期&#xff0c;追求还原度&#xff0c;那我们肯定会使用很多常用的布局方式&#xff0c;那我们今天就介绍一下微信小程序中常用的一些flex布局 1、常用flex布局 /** 水平垂直居中 **/ .flex-center {display: fle…