После поиска по многим страницам, документации по GLM, учебным пособиям и т. Д., Я все еще смущен некоторыми вещами.
Я пытаюсь понять, почему мне нужно применить следующие преобразования, чтобы получить изображение размером 800×600 (в полноэкранном квадрате, предположим, что для этого минимального примера экран пользователя имеет размер 800×600), чтобы рисовать поверх всего. Предположим, я рисую только треугольники CCW. Все отображается хорошо в моем коде, но я должен сделать следующее:
// Vertex data (x/y/z), using EBOs
0.0f, 600.0f, 1.0f,
800.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
800.0f, 600.0f, 1.0f
// Later on...
glm::mat4 m, v, p;
m = scale(m, glm::vec3(-1.0, 1.0, 1.0));
v = rotate(v, glm::radians(180.0f), glm::vec3(0.0f, 1.0f, 0.0f));
p = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f);
(Обратите внимание, что так как я использовал имена переменных m
, v
, а также p
не означает, что они на самом деле правильное преобразование для этого имени, выше просто делает то, что я хочу)
Я запутался в следующем:
Где границы орфографии? Я предполагаю, что он направлен вниз по отрицательной оси Z, но где появляются левые / правые границы? Означает ли это, что [-400, 400] на оси x отображается на [-1.0, 1.0] NDC, или что [0, 800] отображается на него? (Я предполагаю, что любой ответ здесь применим к оси Y). Тогда документация просто говорит Creates a matrix for an orthographic parallel viewing volume.
Что произойдет, если вы перевернете следующие третий и четвертый аргументы (я спрашиваю, потому что я вижу, что люди делают это, и я не знаю, является ли это ошибкой / опечаткой, или это работает по счастливой случайности … или если это работает правильно, независимо от того):
Аргументы три и четыре здесь:
_____________
| These two |
p1 = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f);
p2 = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.5f, 1.5f);
Код, представленный в этом примере (за исключением имен переменных), является единственным, что я использую, и рендеринг работает отлично … это просто мое отсутствие знаний о том, почему это работает, что мне не нравится.
РЕДАКТИРОВАТЬ: пытался понять это от Вот используя изображения и описания на сайте в качестве единственного примера ссылки. Возможно, я упустил суть.
РЕДАКТИРОВАТЬ 2: Как случайный вопрос, так как я всегда рисую свою плоскость в z = 1.0, я должен ограничить мою ортогональную проекцию около / далеко плоскости, чтобы быть настолько близким к 1.0 насколько возможно (например: 0.99, 1.01) по любой причине? Предположим, что больше ничего не нарисовано или будет нарисовано.
Вы можете принять видимую область в ортографической проекции как куб, заданный в пространстве вида. Затем этот куб отображается в куб [-1,1] в координатах NDC, так что все внутри куба является видимым, а все снаружи будет вырезано. Как правило, зритель смотрит вдоль отрицательной оси Z, в то время как + x направо и + y вверх.
Как ортогональные границы отображаются в пространстве НДЦ?
Длина стороны куба определяется параметрами, переданными в glOrtho
, В первом примере параметрами для левого и правого каналов являются [0, 800], таким образом, пространство от 0 до 800 по оси x отображается на [-1, 1] по оси NDC x. Аналогичная логика происходит вдоль двух других осей (сверху / снизу вдоль y, рядом / далеко вдоль -z).
Что происходит, когда верхний и нижний параметры меняются?
Чередование, например, верха и низа эквивалентно отражению сцены вдоль этой оси. Если вы посмотрите на второй диагональный элемент ортографическая матрица, это определяется как 2 / (top - bottom)
, При обмене сверху и снизу меняется только знак этого элемента. То же самое также работает для обмена слева на право или рядом с далеко. Иногда это используется, когда начало пространства экрана должно находиться в левом нижнем углу вместо левого верхнего.
Почему вы должны повернуть квад на 180 ° и отразить его?
Как описано выше, ближние и дальние значения находятся вдоль Negativ Z-ось. Значения [0,5, 1,5] вдоль -z означают [-0,5, -1,5] в координатах мирового пространства. Поскольку плоскость определена как z = 1.0, она находится за пределами видимой области. Поворачивая его вокруг начала координат на 180 градусов, вы перемещаете его к z = -1.0, но теперь вы смотрите на него сзади, что означает удары по выбраку на задней стороне. Отражая его вдоль оси x, порядок намотки изменяется и, таким образом, меняются задняя и передняя стороны.
Поскольку я всегда рисую свою плоскость при z = 1,0, должен ли я ограничить свою ортографическую проекцию в ближней / дальней плоскости настолько близкой к 1,0, насколько это возможно?
Пока вы больше ничего не рисуете, вы можете выбирать, что хотите. Когда рисуется несколько объектов, диапазон между ближним и дальним определяет, как можно сохранить точные различия в глубине.
Других решений пока нет …