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