找回密码
 立即注册
查看: 529|回复: 4

unity中默认获取的深度图到底是什么空间下的?

[复制链接]
发表于 2021-4-23 12:42 | 显示全部楼层 |阅读模式
unity中默认获取的深度图到底是什么空间下的?
发表于 2021-4-23 12:48 | 显示全部楼层
unity在某个版本后使用了反向z(Reversed-Z)来处理z fighting问题,所以是倒过来的。
反向z先是把摄像机的矩阵改了(你可以看到摄像机矩阵和摄像机的世界坐标x投影矩阵并不一样,就一个值不一样,好像是03),然后自动把你的shader的ztest creater和ztest less翻转,深度测试本身就没问题了。
它改的直接是摄像机的投影矩阵,所以到clip的那里,z就已经倒过来了,如果你要在这时候做些比较判断就要注意。
应该是一个版本后整体都变了,所以不需要分支做处理,如果看到这样的深度图,那就是最近处为1,最远处为0,然后统一处理就好。
但是在世界空间的时候还没有翻。




至于你的问题……要看你真正想问什么。你问ndc空间下的z是啥?那就是你看到的值,因为投影矩阵直接被改了,只是ndc的z和view空间的对应方式是倒着的。
如果你想用ndc空间的z反求view空间的z,那么就乘下被修改后的投影矩阵的逆。
我不太记得是哪个值不一样了,你debug camera对象的摄像机矩阵能看到。
发表于 2021-4-23 12:53 | 显示全部楼层
原来的回复是手机上快速回复的,没仔细看题主的问题。
这个[0,1]的值,其实有很多种使用方式。因为浮点数精度的原因,越靠近0,精度越高,有一些系统会将远离摄像机的far plane,设置为0,从而能够提高远处深度层次的精度,从而避免出现z-fighting的情况。
题主可以在知乎上查一下,有一个类似的问题,说的比较仔细。
窝的舔:反向Z(Reversed-Z)的深度缓冲原理这篇是其中一篇。
发表于 2021-4-23 13:01 | 显示全部楼层
Unity提供了2个函数,把ndc下的z还原,
float Linear01Depth( float z ),这个返回映射到0~1的线性z值
float LinearEyeDepth( float z ),返回线性的距离
不用考虑api或者reversed-z的情况,返回的值都是越近越小
发表于 2021-4-23 13:01 | 显示全部楼层
Unity采样的深度图是ndc下的,非线性深度。
Opengl平台应该是近裁剪面为0,远裁剪面为1。ndc下是深度范围是[-1,1],因为进行了映射才在[0,1]。
DX平台的话一般会进行reverse-z,Opengl是没有reverse-z的,近裁剪面为1,远裁剪面为0。ndc下深度范围[0,1]。
所以可以看一下你的unity使用的图形API(我猜应该是DX),如果是Opengl,可以通过 映射回去ndc范围深度。如果是DX,可以通过 得到ndc范围深度。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 04:30 , Processed in 0.123464 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表