Должен ли я использовать мировую матрицу?

8

Ссылка на изображение для вопроса:

объектное пространство против мирового пространства

(изображение из учебника CG )

API D3D9 привел нас к мировым матрицам .

Однако, если вы используете мировые матрицы, то вам нужно сделать дополнительное матричное умножение в шейдере (которое в конечном итоге будет одинаковым для целого ряда вершин).

Отсюда соглашение OpenGL о объединении матриц моделирования и просмотра в одну матрицу (GL_MODELVIEWMATRIX = View * World).

Что лучше и почему?

bobobobo
источник

Ответы:

7

Нет, вы никогда не должны иметь явную матрицу мира в своем шейдере.

Подробное объяснение причин можно найти здесь , но короткая версия действительно очень проста: она вам никогда не понадобится, и она может убить вашу точность с плавающей точкой.

Если ваше мировое пространство слишком велико, то камера, которая находится далеко от источника, может вызвать проблемы с точностью с плавающей точкой.

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

Вы можете иметь дело с проблемами точности в C ++, используя удвоения вместо вычислений с плавающей запятой. Вы можете преобразовать их обратно в float перед загрузкой в ​​шейдер.

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

Освещение может быть сделано в пространстве камеры так же легко, как в мировом пространстве; все, что вам нужно сделать, это преобразовать ваши световые позиции / направления в пространство камеры. В конце концов, пространство камеры имеет тот же масштаб, что и мировое пространство. Вы делаете это преобразование один раз за кадр за свет; вряд ли нагрузка на производительность даже на процессоре.

Так что нет абсолютно никакого смысла подвергать ваши шейдеры явному преобразованию пространства мира. Это просто промежуточный шаг, который вы складываете в свои матрицы.

Николь Болас
источник
1

Вы бы не делали дополнительное умножение матриц в своем шейдере. Хитрость в том, что вы выполняете матричное умножение один раз за кадр в ЦП, а затем загружаете окончательный результат в ваш вершинный шейдер. Это дает вам одну позицию по умножению матриц на каждую вершину, независимо от того, есть ли у вас мир и вы видите отдельный или объединенный.

Максимус Минимус
источник
0

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

Локальная матрица также необходима для преобразования касательных векторов и нормальных векторов [1] в мировое пространство для затенения, при условии, что вы делаете затенение в мировом пространстве (вы можете сделать это в касательном пространстве, и в этом случае вам потребуется другой набор матриц).

Итак, IMO, имеет смысл иметь две матрицы: локальную для мира и мировую для клипа. Последний является произведением матрицы вида и матрицы проекции. Передайте оба в вершинный шейдер и сделайте умножения, например:

posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

[1] (Пока у вас нет неравномерного масштабирования. В этом случае нормали должны быть преобразованы с помощью обратной транспонирования локальной матрицы).

Натан Рид
источник
-1: мировое пространство плохое. Очень плохо; Вы не должны использовать его в шейдерах
Николь Болас
@NicolBolas: Хороший вопрос; Есть проблемы точности с затенением в мировом пространстве. Это не значит, что вы должны использовать пространство камеры. В моей работе мы на самом деле используем «мир, ориентированный на камеру» - оси, выровненные по миру, происхождение у камеры. Наличие ориентированных на мир осей облегчает применение кубических карт, хранящихся в мировом пространстве.
Натан Рид