Главная Статьи Ссылки Скачать Скриншоты Юмор Почитать Tools Проекты Обо мне Гостевая Форум |
Есть два довольно тонких отличия 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 вместо нее используется следующая матрица:
Здесь и .