Самый быстрый способ взять координаты из пространства модели в пространство канонических координат в OpenGL ES 2.0

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


person Leif Andersen    schedule 24.07.2011    source источник


Ответы (1)


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

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

gl_Position = uProjection * (uMV * aPosition);

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

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

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

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

person Nicol Bolas    schedule 24.07.2011
comment
ссылка для объяснения больше не существует. Вы бы обновили? - person Kenji Noguchi; 06.01.2019