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;
}