Не путайте то, что вы вводите в GL и что оно выводит.
параметры, которые вы используете для вычисления матрицы Орто, соответствуют вашим входным данным . Выходной результат матрицы проекции всегда равен кубу [-1: 1] x [-1: 1] x [-1: 1].
область просмотра переводит этот куб в координаты цели вашего рендера. Так что, как правило, это то, что вы хотите изменить, чтобы соответствовать вашему новому размеру окна (ну, это и сам кадровый буфер).
Да, GL делает много бесполезных вещей для 2D-рендеринга. В конце концов, это 3D API ...
В заключение я скажу, что вам не нужно строить матрицы для выполнения 2D-преобразований, если ваш вершинный шейдер выводит куб, о котором я упоминал ранее. Если вы хотите написать верхний правый угол области просмотра, вы всегда можете передать свои вершины непосредственно как (0,0) (0,1) (1,0) (1,1) и просто вывести это.