PSSMDemo.PSSM.SplitDistance C# (CSharp) Method

SplitDistance() private method

private SplitDistance ( float nearClipDistance, float farClipDistance, float distances ) : void
nearClipDistance float
farClipDistance float
distances float
return void
        void SplitDistance(float nearClipDistance, float farClipDistance, float[] distances)
        {
            if (count == 1)
            {
                // 分割無しの場合における最適化。
                distances[0] = nearClipDistance;
                distances[1] = farClipDistance;
                return;
            }

            float n = nearClipDistance;
            float f = farClipDistance;
            float m = count;

            float fdn = f / n;
            float fsn = f - n;
            float invLambda = 1.0f - lambda;

            for (int i = 0; i < count + 1; i++)
            {
                float idm = i / m;

                // CL = n * (f / n)^(i / m)
                // CU = n + (f - n) * (i / m)
                // C = CL * lambda + CU * (1 - lambda)

                // CL は対数分割での値。
                // CU は均等分割での値。
                // パラメータ lambda で対数分割の程度を調整。
                // lambda = 1 ならば対数分割のみ。
                // lambda = 0 ならば均等分割のみ。

                float log = n * (float) Math.Pow(fdn, idm);
                float uniform = n + fsn * idm;
                distances[i] = log * lambda + uniform * invLambda;
            }

            distances[0] = n;
            distances[distances.Length - 1] = f;
        }