Linear01値からDepth値を求める

環境

Unity2022.3.1f1

概要

Linear01Depth(float z)の逆の関数です。参考のままです。

C#でテスト。同じ値になりました。

using UnityEngine;

public class TestDepthValue : MonoBehaviour
{
    Vector4 _ZBufferParams;
    void Start()
    {
        _ZBufferParams = Shader.GetGlobalVector("_ZBufferParams");
        var depth = 0.5f;
        var linear01 = Linear01Depth(depth);
        Debug.Log($"1 linear01:{depth}>{linear01}");
        depth = DepthFromLinear01(linear01);
        Debug.Log($"1 linear01:{linear01}>{depth}");

        linear01 = 0.2345f;
        depth = DepthFromLinear01(linear01);
        Debug.Log($"2 linear01:{linear01}>{depth}");
        linear01 = Linear01Depth(depth);
        Debug.Log($"2 linear01:{depth}>{linear01}");

        depth = 0.5f;
        var linearEye = LinearEyeDepth(depth);
        Debug.Log($"3 linearEye:{depth}>{linearEye}");
        depth = DepthFromLinearEye(linearEye);
        Debug.Log($"3 linear01:{linearEye}>{depth}");

        linearEye = 0.4567f;
        depth = DepthFromLinearEye(linearEye);
        Debug.Log($"4 linear01:{linearEye}>{depth}");
        linearEye = LinearEyeDepth(depth);
        Debug.Log($"4 linearEye:{depth}>{linearEye}");
    }

    float Linear01Depth(float z)
    {
        return 1.0f / (_ZBufferParams.x * z + _ZBufferParams.y);
    }

    float DepthFromLinear01(float linear01)
    {
        //linear01といっても1.0f / _ZBufferParams.y未満にはならないと思われる

        //return (1.0f / ( linear01 * _ZBufferParams.x)) - (_ZBufferParams.y / _ZBufferParams.x);
        //return ((1.0f / linear01) - _ZBufferParams.y) / _ZBufferParams.x;
        return (1.0f - _ZBufferParams.y * linear01) / (_ZBufferParams.x * linear01);
    }

    float LinearEyeDepth(float z)
    {
        return 1.0f / (_ZBufferParams.z * z + _ZBufferParams.w);
    }

    float DepthFromLinearEye(float linearEye)
    {
        //return ((1.0f / linearEye) - _ZBufferParams.w) / _ZBufferParams.z;
        return (1.0f - _ZBufferParams.w * linearEye) / (_ZBufferParams.z * linearEye);
    }
}

参考

Linear01Depth()で線形にした深度値を元の値に戻したい #Unity - Qiita

DecodeDepthNormal/Linear01Depth/LinearEyeDepth explanations - Unity Forum