Как и во многих трехмерных графических программах, у меня есть группа объектов, которые имеют свои собственные координаты модели (от -1 до 1 по осям x, y и z). Затем у меня есть матрица, которая переводит ее из координат модели в мировые координаты (используя местоположение, вращение и масштаб рисуемого объекта). Наконец, у меня есть вторая матрица для преобразования этих мировых координат в канонические координаты, которые OopenGL ES 2.0 будет использовать для рисования на экране.
Итак, поскольку один объект может содержать много вершин, каждая из которых использует одно и то же преобразование как в мировое пространство, так и в канонические координаты, быстрее рассчитать произведение этих двух матриц один раз и поместить каждую вершину через полученную матрицу, вместо того, чтобы помещать каждую вершину через обе матрицы.
Но, насколько я могу судить, в шейдерах OpenGL ES 2.0, похоже, не было способа рассчитать матрицу один раз и продолжать использовать ее до тех пор, пока одна из двух матриц не будет использована до glUniformMatrix4fv () (или другая функция для установки униформы) вызывается. Таким образом, кажется, что единственный способ рассчитать матрицу один раз - это сделать это на процессоре, а затем привести к графическому процессору, используя униформу. В противном случае, когда что-то вроде:
gl_Position = uProjection * uMV * aPosition;
он будет вычислять его снова и снова, что, похоже, потратит время.
Итак, какой путь обычно считается стандартным? Или есть другой способ, который я полностью пропускаю? Насколько я могу судить, шейдер, используемый для реализации конвейера OpenGL ES 1.1 в Руководстве по программированию OpenGL ES 2.0, использовал только одну матрицу, так что это больше?