Является ли это менее эффективным, чем использование собственной пользовательской матрицы через функцию glLoadMatrix, которая выполняет те же функции?
Очень вероятно. Однако, если вы столкнулись с ситуацией, когда настройка матриц преобразования стала узким местом, вы делаете что-то в корне неправильно. В разумно написанной графической программе реального времени вычисление матриц преобразования должно составлять лишь очень небольшое количество всего обработанного.
Примером очень плохого программирования было что-то вроде этого (псевдокод):
glMatrixMode(GL_MODELVIEW)
for q in quads:
glPushMatrix()
glTranslatef(q.x, q.y, q.z)
glBindTexture(GL_TEXTURE_2D, q.texture)
glBegin(GL_QUADS)
for v in [(0,0), (1,0), (1,1), (0,1)]:
glVertex2f(v[0], v[1]
glEnd()
glPopMatrix()
Код, подобный этому, будет работать очень плохо. Сначала вы тратите очень много времени на вычисление новой матрицы преобразования для каждого четырехугольника, затем перезапускаете примитивный пакет для каждого четырехугольника, переключатели текстур уничтожают кэши и, наконец, не в последнюю очередь - использование немедленного режима. Действительно, приведенный выше код является худшим из всех анти-паттернов OpenGL в одном примере.
Лучшая ставка для повышения эффективности рендеринга - избегать паттернов, которые вы видите в приведенном выше примере.