推了挺久,这里记录一下结论 ,其中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移动分母里去了,至此结束。

3079

被折叠的 条评论
为什么被折叠?



