Я реализую нормальное отображение касательного пространства в своем приложении OpenGL, и у меня есть несколько вопросов.
1) Я знаю, что, естественно, матрица TBN не всегда ортогональна, потому что координаты текстуры могут иметь перекос. Я знаю, что вы можете повторно ортогонализировать это, используя процесс Грамма-Шмидта. У меня такой вопрос: вводит ли процесс Грамма-Шмидта видимые артефакты? Получу ли я лучшее визуальное качество, используя чистый неизмененный нормальный / касательный / битангент?
2) Я заметил, что во многих уроках они выполняют расчеты освещения в касательном пространстве вместо пространства просмотра. Почему это? Я планирую использовать отложенный рендер, поэтому мои нормали должны быть сохранены в буфер, я прав в том, что они должны быть в поле зрения при сохранении? Чего бы мне не хватало, если бы в расчетах использовалось пространство представления вместо касательного пространства? Если я использую пространство просмотра, нужна ли обратная матрица TBN?
3) В шейдерном фрагменте нужно ли повторно нормализовать тангенс и битангенс? После умножения входящей (нормализованной) карты рельефа на нормальную, нужно ли ее перенормировать? Повлияет ли на это ортогональность (см. Вопрос 1)? Какие векторы нужно или не нужно перенормировать во фрагментном шейдере?
Вносит ли процесс Грамма-Шмидта видимые артефакты?
Это зависит от желаемого результата. Но обычный ответ — да, поскольку векторы нормалей отображаются в касательном пространстве. Ортогонализация касательного пространства искажает вычисления нормального отображения, если координаты текстуры определяют неортогональное основание.
Я заметил, что во многих уроках они выполняют расчеты освещения в касательном пространстве вместо пространства просмотра. Почему это?
Выполнение отображения нормалей в пространстве вида потребует преобразования каждого текселя карты нормалей в пространство просмотра. Это дороже, чем преобразование световых векторов в касательное пространство в вершинном шейдере и запуск стадии барицентрической интерполяции (что гораздо эффективнее).
В шейдерном фрагменте нужно ли повторно нормализовать тангенс и битангенс?
Нет. Вы должны нормализовать отдельные векторы после их преобразования (карта нормалей, направление на источник света и точку обзора), но перед выполнением расчетов освещенности.