steps3D - Tutorials - Vulkan. Особенности систем координат

Особенности систем координат в Vulkan, отличия от OpenGL

Есть два довольно тонких отличия OpenGL от Vulkan в том, что касается систем координат. И очень важно понимать их при переходе от OpenGL к Vulkan.

Первое отличие - система координат в NDC (нормализованные координаты устройства, т.е. координаты после выполнения перспективного деления).

Рис. Отличие NDC в OpenGL Vulkan

В OpenGL у нас левая система координат, ось Oy смотрит вверх. В Vulkan у нас правая система координат - ось Oy смотрит вниз. Т.е. в Vulkan мы просто перевернули ось Oy. Соответственно точка (x = -1, y = -1соответствует нижнему левому углу окна в OpenGL и верхнему левому углу в Vulkan.

Рис. Координаты в окне

Другим достаточно важным отличием Vulkan от OpenGL является диапазон изменения координаты z в NDC. В OpenGL вся видимая область это симметричный куб [-1,1]3, т.е. координата z изменяется от -1 (соответствующего ближней плоскости отсечения) до 1 (соответствующего дальней плоскости).

Но такой подход обладает одним существенным недостатком. Числа с плавающей точкой обеспечивают наибольшую точность в окрестности нуля. Поэтому в OpenGL наибольшая точность буфера глубины будет ровно посередине между ближней и дальней плоскостями отсечения, что довольно неудобно.

Поэтому в Vulkan принято другое соглашение - в нормализованных координатах координата z изменяется от 0 до 1, обеспечивая наибольшую точность буфера глубины у ближней плоскости отсечения.

Соответственно в OpenGL обычно используется следующая матрица перспективного проектирования:

Здесь через l,r,b,t,f и n задают диапазон изменения координат x, y и z.

В Vulkan вместо нее используется следующая матрица:

Здесь и .