Вопрос по opengl – Что делает оператор mat3 (матрица mat4) в glsl?

12

Я делаю освещение для каждого фрагмента и, исправляя нормальный вектор, я получил этот код:vec3 f_normal = mat3(MVI) * normal; Где MVI находится:mat4 MVI = transpose(inverse(ModelViewMatrix));, Так что же после возвращенияmat3(MVI) заявление?

Ну, простое рассуждение (и лишь небольшое понимание математических основ компьютерной графики) диктует, что это верхняя левая часть 3х3. Кроме того, ни в коем случае не транспонируйте и не инвертируйте вашу матрицу в шейдере. Он не изменяется для каждой вершины и может быть выполнен в ЦП (где это не занимает больше времени для одной матрицы). Christian Rau

Ваш Ответ

2   ответа
14
mat3(MVI) * normal

ь. Эта матрица называется «нормальной матрицей». Вы используете это, чтобы перенести ваши нормали из мирового пространства в пространство глаз. Верхняя часть матрицы 3х3 важна для масштабирования и поворота, а остальная часть предназначена только для перевода (и нормали никогда не переводятся)

Чтобы взять нормальное из мирового пространства в космическое, вам просто нужно 3x3inverse transpose матрицы вида модели. Если ваша матрица не является нормальной (без неоднородного масштаба), в этом случае исходная матрица совпадает с ее обратной транспонированием.

@ Правильно. Я исправлю свой ответ, чтобы избежать неправильного представления людей.
Использование верхних 3x3 матрицы вида модели работает только тогда, когда нет неравномерных масштабов, в противном случае необходимо использовать транспонирование инверсии вида модели (которая представляет собой матрицу 4x4). Обратите внимание, что при умножении на матрицу 4x4 вы должны установить w-компоненту нормали в ноль.
3

Типы GLSL: "There are no restrictions on size when doing matrix construction from another matrix. So you can construct a 4x2 matrix from a 2x4 matrix; only the corresponding elements are copied.", Таким образом, в результате вы получаете верхнюю левую подматрицу MVI 3x3.

Спасибо за быстрый ответ, так влияет ли это на конечный результат? (почему он не использует четвертый элемент в векторе нормали, но удаляет некоторые элементы в MVI?) Bình Nguyên
Это общая операция, и она ничего не знает о семантике базовой матрицы, с которой работает.

Похожие вопросы