Поскольку все еще нет полных ответов, я решил, что мне стоит попробовать:
1) Нет и нет. Представьте себе три вектора v1
, v2
и v3
, которые попарно ортогональны и имеют единичную длину. Тогда, конечно, -v3
имеет длину единицы и также ортогональн к v1
и v2
. Теперь представьте матрицы A=(v1|v2|v3)
и B=(v2|v1|-v3)
. Если вы интерполируете между ними, вы получите C=((v1+v2)/2|(v1+v2)/2|0)
прямо в середине. Легко видеть, что это не будет поддерживать длину: (0 0 1)^T
просто станет нулевым вектором. Кроме того, первый и второй столбцы будут равны, что означает, что их угол равен 0 °. Однако на практике две матрицы, которые вы будете интерполировать, обычно не будут достаточно разными для такого вырождения. это если ваша поверхность ориентируема. Поверхности ориентируемы, если на них можно определить согласованность внутри и снаружи. Мебиус-стрип - типичный контрпример!
Немного более правильным способом будет интерполяция поворотов (опять же, поверхность должна быть ориентируемой): вы можете использовать сферическую интерполяцию (google!) Или нормализованную интерполяцию (интерполировать матрицы и ортогонализировать, но это также не удастся в некоторых случаях) , Однако обе интерполяции могут быть дорогостоящими - и на практике люди просто преобразуют источник света в координаты TBN вершин и используют линейную интерполяцию (что эквивалентно просто линейной интерполяции на матрицах TBN).
2.) Определенно, да. На самом деле, это работает для любой длины, а не только один. Ортогональные матрицы индуцируют изоморфные отображения, которые сохраняют как длины, так и углы между векторами. Два вида преобразований, которые вы можете определить с помощью таких матриц, - это вращения и зеркала, оба из которых интуитивно показывают это.
3.) Лично я просто добавил бы их, а затем перенормировал. Mipmapping обычно размывает нормальные карты на расстоянии, потому что нормали становятся короче во время усреднения. Конечно, вы можете перенормировать нормали в поколении мип-карт, но я бы оставил это, чтобы предотвратить наложение псевдонимов и заставить этот эффект работать. Кроме этого, это в основном вопрос вкуса (и выглядит!), Как вы комбинируете два. Честно говоря, это, вероятно, лучший способ вообще не использовать подробные карты нормалей и просто использовать текстуры с более высоким разрешением. В настоящее время графическое оборудование имеет достаточно оперативной памяти для простых вещей, подобных этому, и вы всегда можете передавать потоковое содержимое, если считаете, что оперативная память становится проблемой.