Для интерполяции между перспективой и ортогональной проекцией c Я использую следующую формулу (которая прекрасно работает, потому что плоскости отсечения идеально совпадают):
X' = rw + X / ((Z * fwi - ox) * (1f - a) + ox);
Y' = rh + Y / ((Z * fhi - oy) * (1f - a) + oy);
Где: rw или rh is (renderWidth или Height - 1) / 2f, бык vSize / rw, ой hSize / rh, fwi - загар (vFOV / 2) / rw, fhi - загар (hFOV / 2) / rh, а - коэффициент lerp; 0 = перспектива, 1 = орфография c, 0,5 = между ними.
Теперь, чтобы правильно рассчитать глубину Z для каждого фрагмента, я вычисляю z = 1 / z перед интерполяцией в пространстве экрана с помощью функция ScanLine и, наконец, вычисление истинной глубины в конце с помощью 1 / z.
Однако проекция orthographi c не требует этой коррекции глубины, поэтому мне было интересно, как правильно определить истинный Z , когда проекция смешивается. Текущая формула XYZ в XY может быть суммирована следующим образом:
В настоящее время я интерполирую координаты UV через глубину, и это явно неправильно, когда проекция находится между перспективой и орфографией c. Когда он достигает 1, он обходит коррекцию глубины 1 / z.
Обратите внимание, что это программный рендер, поэтому производительность очень важна. В идеале я хотел бы делать то же самое, что делает OpenGL в подобных ситуациях.