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.hqwc.cn/news/337057.html

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

相关文章

阿里云的通义千问VS百度的文心一言~~

最近人工智能热度迅速升温,我体验了一下各大厂商的大模型的能力,发现他们确实很智能! 我想问一下“南方小土豆”这个梗是如何火起来的,结果如下: 文心一言: 回答的比较准确,但有一些过于“官方”…

创建mysql普通用户

一、创建mysql普通用户的原因: 权限控制:MySQL的权限系统允许您为每个用户分配特定的权限。通过创建普通用户,您可以根据需要为每个用户分配特定的数据库和表权限,而不是将所有权限授予一个全局管理员用户。这有助于提高数据库的…

40-特殊运算符delete,new,.getDate,.setDate,运算符优先级

1.delete删除. 数组 // 可以删除数组元素,可以删除对象键值对// 删除数组的值,数组长度保持不变// 删掉的值变成emptyvar arr [1,2,3,4,5];delete arr[0];console.log(arr); 对象 var obj {"a":"aa","b":"bb&quo…

小红书获得小红书笔记详情 API (smallredbook.item_get_video)在电商中的发展

小红书笔记详情API(smallredbook.item_get_video)在电商中具有广阔的发展前景,具体来说: 优化商品展示:通过API获取的商品视频详情,可以丰富商品展示形式,提供更加全面、生动的商品信息&#xf…

[AutoSar]基础部分 autosar分层架构及BSW介绍

目录 关键词平台说明一、BSW是什么二、BSW的组成2.1 微控制器抽象层(MCAL)2.2 ECU抽象层2.3 服务层2.4、复杂驱动 三、功能的实现 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff…

试问南昌大学——“荧”是怎么“赢”(大学生创新创业疑点案例3)

在第七届中国国际“互联网”大学生创新创业大赛上,南昌大学取得19金并斩获大赛冠军的佳绩! 这期我们一起了解大赛金奖团队——南昌大学荧光微视项目团队的创新创业故事吧! 回望整个比赛历程,团结协作一直是打开项目成功大门的金…

RAG:让大语言模型拥有特定的专属知识

作为一个在Chatbot领域摸爬滚打了7年的从业者,笔者可以诚实地说,在大语言模型的推动下,检索增强生成(Retrieval Augmented Generation,RAG)技术正在快速崛起。 RAG的搜索请求和生成式AI技术,为搜…

省心省力的EMS企业托管服务,全面提升企业运维效能

随着科技革命不断发展,信息化、数字化转型逐渐覆盖企业的方方面面。据IDC《全球数字化转型支出指南》数据显示,2022年全球数字化转型投资规模超过1.5万亿美元,并有望在2026年迈过3万亿美元大关。随着企业对数字化转型的重视加深,相…

牛刀小试 - C++ 实现2048(可存档)

参考文档 借助了这位大佬的开发思路, 开发过程中学到了很多 C语言实现《2048游戏》 技术点: system调整控制台大小的问题 unsigned and 符号位 C对齐输出(左对齐和右对齐) C goto语句详解 完整代码 /********************…

[Linux进程(一)] 什么是进程?PCB的底层是什么?以及进程标识符pid与ppid

文章目录 1、前言2、描述进程 — PCB(os怎么管理进程呢)3、查看进程3.1 方法一3.2 方法二 4、系统调用获取进程标示符(PID)4.1 获取进程的ID4.2 获取进程的父进程ID 5、系统调用创建子进程-fork 1、前言 大家经常都在讲进程,而它到底是什么呢? 这里给大…

2015年电赛控制类—STM32风力摆控制系统资料+源程序

目录 一、项目背景 二、主要研究内容 三、总体思路与研究方案 四、主要研究结果 五、程序 六、图片 一、项目背景 风力摆控制系统是一种利用风力控制物体做简谐运动的系统,风力的利用和控制技术在我国的发展尚未完善,国内正处于起步阶段。风力摆的…

用React给XXL-JOB开发一个新皮肤(二):目录规划和路由初始化

目录 一. 简述二. 目录规划三. Vite 配置 3.1. 配置路径别名3.2. 配置 less 四. 页面 4.1. 入口文件4.2. 骨架文件4.3. 普通页面 五. 路由配置六. 预览启动 一. 简述 上一篇文章我们介绍了项目初始化,此篇文章我们会先介绍下当前项目的目录规划,接着对…