Я пытаюсь настроить мой рендерер и настраиваю матрицы. В настоящее время у меня есть 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.
Любая помощь приветствуется!