glViewport () полностью независим от стеков матричного преобразования и может быть вызван в любое время.
glLoadIdentity () обычно вызывается сразу после смены режима матрицы, поэтому вы начинаете «заново», если хотите. Матричные преобразования, такие как gluPerspective (), glOrtho (), glFrustum (), glRotate (), glMultMatrix (), glTranslate (), являются кумулятивными операциями, поскольку они агрегируют, чтобы позволить вам описывать сложные преобразования трехмерного пространства мира или описывать просмотр OpenGL объем. Пример: если я хочу, чтобы куб переводился в направлении + X, а затем вращался вокруг оси Z, я запускаю glRotate (), за которым следует glTranslate ().
glLoadIdentity () стирает матрицу (текущего режима матрицы) с единичной матрицей, поэтому следование за gluPerspective () с помощью glLoadIdentity () эквивалентно единственному вызову glLoadIdentity (). Другими словами, эта последовательность бессмысленна.
В обратном порядке, потому что gluPerspective () умножит текущую матрицу на перспективное преобразование. Если текущая матрица является тождественной, то умножение просто приведет к матричному преобразованию gluPerspective (), которое вам нужно для режима матрицы проекции в 99% случаев при просмотре в перспективе.
Нет различий между OpenGL и OpenGL ES в отношении поведения glMatrixMode () или того, как эти функции матрицы изменяют состояние матрицы GL.