Это все о конвенциях. Здесь нет «причудливого» отображения, оно сводится к подписанию соглашений, используемых для генерации адресов в кадровый буфер. Большинство графического оборудования там, адреса в строках пикселей слева вверху, с быстрым показателем (обычно обозначаемым x), идущим вправо, и медленно работающим указателем (обычно обозначаемым y), идущим вниз.
Таким образом, адрес для пикселя в точках (x, y) - y*row_stride + x
.
. Когда OpenGL помещает начало координат в левом нижнем углу, все, что происходит, это знак переворачивания координаты y
и высоты окна. добавлено в качестве смещения. Таким образом, вычисление становится равным (height - y)*row_stride + x
.
. В общем случае схема генерации адресов обобщает это значение до
address = (off_y + sign_y*y)*row_stride + off_x + sign_x*x
И затем графическому драйверу необходимо установить регистры конфигурации на правильные значения, до начала операции рисования.
Вернее, в современных графических процессорах эти настройки являются частью команд конфигурации окна просмотра и прямоугольника ножниц, которые являются частью потока команд в буфере команд. Вы не видите этого явно в OpenGL, но если вы немного знакомы с Vulkan (или Metal или DX12), которые делают это явным образом, когда вы запускаете проход рендеринга с vkCmdBeginRenderPass , частью команды то, что добавляется в буфер команд - это настройка параметров адресации; правильные значения смещений и знака, чтобы соглашения Vulkan и используемой оконной системы были согласованы, заполняются водителем за занавесом.