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

LinearEyeDepth和Linear01Depth

在UnityCG.cginc中:

// Z buffer to linear 0..1 depth
inline float Linear01Depth( float z )
{
    return 1.0 / (_ZBufferParams.x * z + _ZBufferParams.y);
}
// Z buffer to linear depth
inline float LinearEyeDepth( float z )
{
    return 1.0 / (_ZBufferParams.z * z + _ZBufferParams.w);
}

下面是参考《入门精要》中的推导:

https://blog.csdn.net/wodownload2/article/details/94829643
这篇文章讲解了,如何获取unity的深度纹理,并将其显示出来。

当通过纹理采样SAMPLE_DEPTH_TEXTURE之后,得到的深度值往往是非线性的。然而,我们的计算过程中通常是需要线性的深度值,也就是说,我们需要把投影后的深度值变换到线性空间下。
之前的透视投影中得到:
https://blog.csdn.net/wodownload2/article/details/85069240
透视投影矩阵为(unity使用opengl的投影方式,z映射到(-1,1)下):
在这里插入图片描述

也就是说用上面的投影矩阵对view空间下的顶点进行投影,得到:
在这里插入图片描述

上面的得到z’就是齐次裁剪空间的点坐标了。如果需要转换大ndc空间下则,需要进行透视除法。
而透视除法的因子是-z。
在这里插入图片描述
经过透视除法之后,得到z’’,就是在(-1,1)的ndc坐标了:
在这里插入图片描述
深度值z是映射到了-1到1的空间下,而能够保存在一张纹理上,则要需要转化为正数:
z’’’ = 0.5z’’+0.5

z为原始的view空间的深度;z’为齐次裁剪空间的深度;z’‘为ndc空间的深度;z’’'是转化到(0,1)的深度
经过上面的推导可以求出z:
在这里插入图片描述

由于在unity使用的视角空间中,摄像机正向对应的z值均为负值,因此为了得到深度值的正数表示,我们需要对上面的结果取反,最后得到的结果为:
在这里插入图片描述
它的取值范围是视锥体深度范围,即[near, far]。如果我们想得到范围在[0,1]之间的深度,只需要将上面的结果除以far即可。这样,0就表示该点与摄像机位于同一位置,1表示该点位于视锥体的远裁剪平面上,结果为:
在这里插入图片描述

幸运的是,unity提供了两个辅助函数来为我们进行上述的计算过程——LinearEyeDepth和Linear01Depth。

LinearEyeDepth负责把深度纹理的采样结果转换到视角空间下的深度值,也就是:
在这里插入图片描述
而Linear01Depth则返回一个范围在[0,1]的线性深度值。
在这里插入图片描述
经过上面的解释,应该很明确这两个函数的意思了。

相关文章:

  • 打印沙漏
  • SQLAlchemy增删改查 一对多 多对多
  • 体积光,体积雾——链接
  • python 变量搜寻顺序法则LEGB之E注意事项
  • 体积雾
  • Java线程池详解(一)
  • 穷人为什么穷?
  • 【bzoj4567】[Scoi2016]背单词
  • Python基础python是如何进行内存管理的
  • Scriptable Render Pipeline-Custom Pipeline
  • C面试题1
  • [虚树][lca][dfs] 洛谷 P3233 世界树
  • Python Mysql 批量导入数据问题
  • Scriptable Render Pipeline-Baked Shadows
  • Hive| ETL清洗 查询练习
  • SegmentFault for Android 3.0 发布
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【笔记】你不知道的JS读书笔记——Promise
  • 3.7、@ResponseBody 和 @RestController
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Create React App 使用
  • CSS居中完全指南——构建CSS居中决策树
  • docker-consul
  • HomeBrew常规使用教程
  • JAVA 学习IO流
  • Java的Interrupt与线程中断
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Xmanager 远程桌面 CentOS 7
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 日剧·日综资源集合(建议收藏)
  • 如何学习JavaEE,项目又该如何做?
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 译有关态射的一切
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​力扣解法汇总946-验证栈序列
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ()、[]、{}、(())、[[]]命令替换
  • (1)(1.11) SiK Radio v2(一)
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (TOJ2804)Even? Odd?
  • (zhuan) 一些RL的文献(及笔记)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (zt)最盛行的警世狂言(爆笑)
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (理论篇)httpmoudle和httphandler一览
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 路由处理厉害了
  • .net 生成二级域名
  • :=
  • @在php中起什么作用?
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [<MySQL优化总结>]
  • [Android]如何调试Native memory crash issue