Linear01Depth线性深度值与非线性深度值转换

推了挺久,这里记录一下结论 ,其中F为远平面距离 N为近平面距离 Ray为指向顶点的方向向量。

首先说一个坑点。

Linear01Depth这东西,传进去的是非线性的0 1深度值 ,在[0,1]的值域为[N/F,1] 。

不要被01这个名字迷惑,传入0的非线性深度值时,它返回的并不是0 ,而是N/F,这样在计算顶点所在地的时候直接 Ray * Linear01Depth(非线性深度) * F就行。

设观察空间Z值为Z1

然后非线性深度D1=F+N/F-N + 2FN/[(F-N) * Z1],由投影矩阵直接计算得出,这里省略。

这里的非线性深度为[-1,1]的原始非线性深度,Unity中采样得到的非线性深度在[0,1]中,后续计算需要处理。

设值域为[0,1]的非线性深度D2

将D1转换为D2并移动式子可以得到Z1,即观察空间中的Z值。

Z1=FN/[(F-N)*D2 - F]   代入0 1可得-N和-F

得到观察空间的Z值后就很容易了 我们这里需要的是[N/F,1] ,原值域为[-F,-N]那直接除以F再取反就可以了。

最后得到的是式子就是 N/[(N-F)*D2 + F]  Unity的Linear01Depth把N移动分母里去了,至此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值