Почему Vulkan не использует стандартную декартову систему координат?

Вулкан использует систему координат, в которой (-1, -1) находится в верхнем левом квадранте, а не в нижнем левом квадранте, как в стандартной декартовой системе координат, которую обычно изучают в школе. Итак, (-1, 1) находится в нижнем левом квадранте в системе координат Вулкана.

Изображение с: http://vulkano.rs/guide/vertex-input

(изображение из: http://vulkano.rs/guide/vertex-input)

В чем преимущества использования системы координат Vulkan? Одно очевидное преимущество, которое я вижу, - педагогическое: оно заставляет людей осознавать, что системы координат произвольны, и их легко можно сопоставить. Однако я сомневаюсь, что это причина дизайна.

Так каковы конструктивные причины этого выбора?


person user89    schedule 30.12.2017    source источник
comment
Я не так хорошо знаком с Vulkan, но начало координат экрана обычно находится в верхнем левом углу. Хотя (-1, -1) необычно (ИМО), похоже, что Вулкан использует что-то вроде единичного вектора (или, в данном случае, единичного прямоугольника). Зачем это делать? Это хороший вопрос, поэтому это комментарий, а не ответ. :)   -  person TriskalJM    schedule 30.12.2017
comment
@TriskalJM Я думаю, что изначально я написал вопрос запутанным образом, поскольку это не то, что (-1, 1) является верхним левым углом, а находится в верхнем левом квадранте. В этом больше смысла?   -  person user89    schedule 30.12.2017
comment
Итак, начало координат находится в центре, положительный x указывает вниз, а положительный y указывает вправо? Они хотели, чтобы начало координат находилось в центре (что имеет смысл), а затем они сохранили традиционный метод положительных значений координат вниз и вправо для экранных координат.   -  person TriskalJM    schedule 30.12.2017
comment
@TriskalJM На самом деле, теперь я не уверен, может быть, это система единичных прямоугольников, которую вы впервые описали. Я все еще изучаю Vulkan, поэтому я еще не совсем уверен. Во всяком случае, я предоставил картинку из гида, который читал.   -  person user89    schedule 30.12.2017
comment
Голосуйте за, потому что хорошо поймать одну из моих типичных ловушек.   -  person Bobbi Bennett    schedule 30.12.2017
comment
Я продолжу поиски, но в this упоминается, что это было намеренно, но у меня нет глубина, чтобы знать, почему эта схема является чем-то более широко используемым и точным.   -  person TriskalJM    schedule 30.12.2017
comment
@ user89: Пожалуйста, прекратите использовать это руководство; это мусор. Он вообще не понимает системы координат Vulkan. Система координат, о которой идет речь, - это пространство NDC, а не пространство пикселей / изображений.   -  person Nicol Bolas    schedule 30.12.2017
comment
@NicolBolas Можете ли вы указать им на лучший учебник?   -  person TriskalJM    schedule 30.12.2017
comment
Объем обзора по умолчанию имеет координату Z, идущую внутрь и от средства просмотра. То есть ближняя плоскость находится при Z = 0, а дальняя плоскость - при Z = 1. Вместе с + X вправо и + Y вниз это делает Vulkan правосторонней системой координат, которая, конечно, является правильной, по мнению профессоров физики. :) Но, как уже упоминалось в другом месте, вы можете перевернуть его с помощью VkViewport с отрицательным .height и настроить .y, это сделает его левым. Поиск Приложение может указывать отрицательный термин для высоты в vulkan spec.   -  person Andrew Tomazos    schedule 05.01.2021


Ответы (2)


Многие системы координат в компьютерной графике помещают начало координат в верхнем левом углу, а ось Y направляет вниз.

Это связано с тем, что в ранних телевизорах и мониторах электронный луч, рисующий изображение, начинается в верхнем левом углу экрана и движется вниз.

Пиксели на экране обычно создавались путем считывания памяти по последовательным адресам, когда луч двигался вниз по экрану, и модуляции этого электронного луча в соответствии с каждым последовательным считыванием байта. Таким образом, ось Y соответствует времени, которое соответствует адресу памяти.

Даже сегодня практически все представления растрового изображения в памяти или в растровом файле начинаются в верхнем левом углу.

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

Когда вы используете начало координат в нижнем левом углу, все становится немного сложнее, потому что для поиска байта, соответствующего пикселю, требуется немного больше математики и необходимо учитывать высоту растрового изображения. Обычно нет причин вводить дополнительную сложность.

Однако, когда вы начинаете вводить матричные преобразования, становится намного удобнее работать с направленной вверх осью y, потому что это позволяет вам использовать всю векторную алгебру, которую вы изучали в школе, без необходимости переворачивать ось y и все вращения в вашем мышление.

Итак, что вы обычно обнаружите, так это то, что когда вы работаете в системе, которая позволяет вам выполнять матричные операции, переводы, повороты и т. Д., Тогда у вас будет ось y, направленная вверх. Однако в какой-то момент глубоко внутри вычисления преобразуют координаты в направленную вниз ось y для низкоуровневых операций.

person Matt Timmermans    schedule 31.12.2017
comment
Разве не будет значительной потери скорости, если нужно преобразовать координаты вверх-y в координаты вниз-y с помощью матричного преобразования, только для того, чтобы после преобразования было отменено (с помощью обратного преобразования)? Не лучше ли вообще просто не преобразовывать в координаты «вверх» и принять педагогическое неудобство, связанное с необходимостью иметь дело с координатой «вниз»? - person user89; 31.12.2017
comment
Преимущество матричных преобразований заключается в том, что вы можете сложить любое их количество в одну матрицу, и всегда есть некоторая матрица, поэтому вы можете применять любые преобразования, которые вам нравятся, совершенно не влияя на производительность. - person Matt Timmermans; 31.12.2017
comment
@ user89 Я использовал новую функцию OpenGL 4.5, сделав верхний левый угол (-1, -1), как у Vulkan, вместо типичного (-1, 1) OpenGL. После этого все оказалось перевернутым, но если умножить второй элемент компонента Y в матрице проекции на -1, все станет нормально. Другими словами, с точки зрения производительности он должен быть точно таким же. - person Zebrafish; 01.01.2018
comment
Нет никаких неотъемлемых преимуществ для системы координат с as + y. Все та же математика вектор / матрица применяется точно так же. Важно то, правая это система координат (направление + z относительно + x и + y). И OpenGL, и Vulkan являются правосторонними системами координат, и я склонен думать, что Vulkan имеет больше смысла, поскольку он следует соглашению для хранения изображений и экранных координат и имеет + z на экране. - person Jonathan Olson; 28.07.2018

Одним из распространенных источников путаницы и ошибок в OpenGL было то, что координаты NDC и окна имели y, увеличивающуюся вверх, что противоречит соглашению, используемому почти во всех оконных системах и многих (но не во всех) форматах изображений, где y равно [0. .1] увеличивается вниз. В конечном итоге разработчикам во многих случаях приходилось вставлять Y-образный переворот в свой конвейер трансформации, и не всегда было ясно, когда они это сделали, а когда нет.

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

Затем были выбраны другие системы координат, чтобы соответствовать этому, в том смысле, что направление y никогда не меняет направление в стандартном конвейере преобразования Vulkan. Это означало, что координаты вершины пространства клипа также имели y, увеличивающуюся вниз.

Это привело к тому, что координаты клипа Vulkan имеют другую ориентацию, чем координаты клипа D3D, что раздражало разработчиков, поддерживающих оба API. Таким образом, расширение VK_KHR_main maintenance1 добавляет возможность указывать отрицательную высоту области просмотра, что, по сути, вводит преобразование координаты пространства клипа в буфер кадра по оси y. (В D3D здесь, по сути, всегда был неявный y-переворот.)

Во всяком случае, я так запомнил рассуждения в Рабочей группе Vulkan. Я не думаю, что где-либо есть авторитетный общедоступный источник.

person Jesse Hall    schedule 31.12.2017
comment
Я не уверен, является ли это частью причины, но OpenGL по умолчанию предполагает правосторонние мировые координаты, но как только умножается на матрицу проекции, координаты становятся левосторонними (x - право, z на экране и y вверх). Если Y спуститься вниз, координаты снова станут правыми. - person Zebrafish; 01.01.2018