JamesB 发表于 2021-4-23 12:42

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

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

ChuanXin 发表于 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对象的摄像机矩阵能看到。

RecursiveFrog 发表于 2021-4-23 12:53

原来的回复是手机上快速回复的,没仔细看题主的问题。
这个的值,其实有很多种使用方式。因为浮点数精度的原因,越靠近0,精度越高,有一些系统会将远离摄像机的far plane,设置为0,从而能够提高远处深度层次的精度,从而避免出现z-fighting的情况。
题主可以在知乎上查一下,有一个类似的问题,说的比较仔细。
窝的舔:反向Z(Reversed-Z)的深度缓冲原理这篇是其中一篇。

xiangtingsl 发表于 2021-4-23 13:01

Unity提供了2个函数,把ndc下的z还原,
float Linear01Depth( float z ),这个返回映射到0~1的线性z值
float LinearEyeDepth( float z ),返回线性的距离
不用考虑api或者reversed-z的情况,返回的值都是越近越小

mypro334 发表于 2021-4-23 13:01

Unity采样的深度图是ndc下的,非线性深度。
Opengl平台应该是近裁剪面为0,远裁剪面为1。ndc下是深度范围是[-1,1],因为进行了映射才在。
DX平台的话一般会进行reverse-z,Opengl是没有reverse-z的,近裁剪面为1,远裁剪面为0。ndc下深度范围。
所以可以看一下你的unity使用的图形API(我猜应该是DX),如果是Opengl,可以通过 https://www.zhihu.com/equation?tex=Z_%7Bscreen%7D%2A2.0-1.0 映射回去ndc范围深度。如果是DX,可以通过 https://www.zhihu.com/equation?tex=1-Z_%7Bscreen%7D+ 得到ndc范围深度。
页: [1]
查看完整版本: unity中默认获取的深度图到底是什么空间下的?