Глубина интерполяции Z в интерполированной перспективе orthographi c Frustum просмотра - PullRequest
2 голосов
/ 10 марта 2020

Для интерполяции между перспективой и ортогональной проекцией 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 может быть суммирована следующим образом:

formula

В настоящее время я интерполирую координаты UV через глубину, и это явно неправильно, когда проекция находится между перспективой и орфографией c. Когда он достигает 1, он обходит коррекцию глубины 1 / z.

image Обратите внимание, что это программный рендер, поэтому производительность очень важна. В идеале я хотел бы делать то же самое, что делает OpenGL в подобных ситуациях.

1 Ответ

2 голосов
/ 13 марта 2020

Хотя метод, который я использовал для интерполяции, вероятно, никем не будет использоваться, математика, стоящая за ним, может быть.

Моя формула плоскости отсечения может быть описана следующим образом: Formula

Где o = Базовый размер, a = Базовое поле зрения, l = от 0 до 1 Это основано на оси Y, чтобы позволить отсечение FOV = 0.

Если установить FOV очень маленьким и установить Z очень далеко назад, ортографическая проекция c может быть сфальсифицирована благодаря крошечному 1 / z тангенсу. Однако я не мог использовать формулу масштабирования тележки, так как уже реализовал пользовательскую систему XYZ-XY.

Поэтому все, что мне нужно было сделать, это сместить значение Z на некоторое число. Глядя на графики отсечения с увеличением долли, стало очевидно, что смещение по Z должно быть перехватом Y.

Graph С увеличением долли вершина Z смещается, а не фактический наклон отсечения, но мой метод XYZ-XY требуется для смещения наклонов отсечения.

Изменение формулы для решения для 0 дает (* -1 для пересечения y):

Formula

И, наконец, можно рассчитать коррекцию Z:

Formula

И с добавленным смещением Z глубина становится теперь правильно интерполировано:

Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...