Матрица проекции вызывает проблему обрезки клипа - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь настроить мой рендерер и настраиваю матрицы. В настоящее время у меня есть View Matrix и Projection Matrix, которые я затем умножаю и отправляю в шейдер (нет необходимости в матрице моделей, так как я только тестирую).

Проблема в том, что я просто не могуполучить правильную матрицу проекции. Моя модель сферы в разрезе пополам в центре экрана, я могу перемещать ее, но как только значение Z для вершин выходит за пределы 1 (максимальное значение Вулкана для NDC), модель обрезается.

Это код для матрицы вида:

ViewMatrix(3, 0) = CamPos.X;
ViewMatrix(3, 1) = -CamPos.Y;
ViewMatrix(3, 2) = CamPos.Z;

Цифры слева - это строки, а цифры справа - столбцы. Матрицы мажорные. И система координат моего рендерера левша.

Это код матрицы проекции, который взят из The Vulkan Cookbook:

auto f = 1 / tan_half_fov;

_Matrix(0, 0) = f / _AspectRatio;
_Matrix(1, 1) = -f;
_Matrix(2, 2) = _Far / (_Near - _Far);
_Matrix(2, 3) = -1;
_Matrix(3, 2) = (_Near * _Far) / (_Near - _Far);
_Matrix(3, 3) = 0;

Матрица - это просто единичная матрица, акаждый кадр, который он получает, устанавливает эти значения. tan_half_fov равно 0,41421356, так как это загар (45 град / 2). _Near равно 1, а _Far равно 500.

У меня также есть код для матрицы проекции из GLM, это версия для левой руки, версия от 0 до 1:

_Matrix(0, 0) = 1 / (_AspectRatio * tan_half_fov);
_Matrix(1, 1) = 1 / tan_half_fov;
_Matrix(2, 2) = _Far / (_Far - _Near);
_Matrix(3, 2) = 1;
_Matrix(2, 3) = -(_Far * _Near) / (_Far - _Near);
_Matrix(3, 3) = 0;

Вершинный шейдер:

void main()
{
    gl_Position = inData.Pos * vec4(inPos, 1.0);
}

inPos - это ввод данных вершины для позиции вершины, а inData.Pos - матрица ViewProjection.

Код умножения матриц работает нормально, я проверял его,При отправке в шейдер только матрицу вида сфера выглядит плоской на экране и перемещается правильно. Я использую Vulkan.

Любая помощь приветствуется!

...