Самый быстрый способ взять координаты из модельного пространства, в каноническое координатное пространство в OpenGL ES 2.0 - PullRequest
1 голос
/ 24 июля 2011

Как и во многих трехмерных графических программах, у меня есть группа объектов, которые имеют свои собственные координаты модели (от -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, использовал только одну матрицу, так что это больше?

1 Ответ

5 голосов
/ 24 июля 2011

Во-первых, правильный термин OpenGL для "канонических координат" - это пространство клипа.

Во-вторых, это должно быть так:

gl_Position = uProjection * (uMV * aPosition);

То, что вы опубликовали, умножает матрицу / матрицу с последующим умножением матрицы / вектора. Эта версия делает 2 умножения матрицы на вектор. Это существенная разница.

Вы используете шейдерное оборудование; как вы справляетесь с матрицами, зависит от вас. Нет ничего, что считается «стандартным»; ты делаешь то, что тебе лучше всего нужно делать.

При этом, если вы не делаете освещение в модельном пространстве, вам часто понадобится некоторый посредник между пространством модели и однородным пространством клипов в 4D. Это пространство, в которое вы преобразуете положения и нормали, чтобы вычислить направление света, точку (N, L) и т. Д.

Лично я не стал бы предлагать мировое пространство по причинам, которые я подробно объясняю здесь. Но будь то мировое пространство, пространство камеры или что-то еще, у вас, как правило, будет какое-то промежуточное пространство, в котором вам нужны позиции чтобы быть в. В этот момент вышеупомянутый код становится необходимым, и, следовательно, не теряется время.

...