Почему на процедурном меше карта нормалей по оси X не отображается корректно при использовании триплинарного шейдера?

Как правильно реализовать карту нормалей в триплинарном шейдере? Нашел статью по этой теме и ищу дополнительные рекомендации.
Изображение к вопросу
  • 5 декабря 2023 г. 14:50
Ответы на вопрос 2
Проблема с отображением карты нормалей на процедурном меше может возникнуть по разным причинам, и одна из наиболее распространенных — это некорректное использование тангенциального пространства, в котором обычно выражаются нормали в текстуре нормалей.

Трипланарное текстурирование (или трёхплоскостное) — это способ проекции текстур без явного UV-развертывания, при котором текстура проецируется на объект с трех основных направлений (X, Y, Z). Это популярно для процедурных и террейнных шейдеров, где сложность развертки или динамичное изменение формы меша делает традиционное UV-развертывание непрактичным.

Чтобы корректно реализовать карту нормалей в трипланарном шейдере, нужно осуществить следующие шаги:

1. **Проекция текстуры.** Необходимо проецировать карту нормалей на меш с трех основных направлений. Каждое направление обычно использует свои собственные координаты, пропорциональные позиции вершин в мировом пространстве.

2. **Смешивание текстур.** Для плавного перехода между разными проекциями используются весовые коэффициенты, которые могут быть основаны на угле нормали меша. Обычно, чем более параллельна нормаль меша направлению оси, тем выше вес проекции этой оси.

3. **Преобразование нормалей.** Нормали из карты, проецированные с разных осей, должны быть приведены к единому пространству – обычно к пространству мировых координат. Это требует вращения нормалей текстуры из касательного пространства карты нормалей в мировое пространство с учетом ориентации каждой проекции.

4. **Корректное размешивание.** После преобразования нормалей для каждой оси, они должны быть смешаны в соответствии с ранее рассчитанными весами. Это должно быть сделано таким образом, чтобы результаты смешивания не искажали размер вектора нормали.

5. **Нормализация.** Результат смешивания различных векторов нормалей может привести к тому, что их длина не будет равна 1. Поэтому важно нормализовать итоговый вектор нормали, чтобы он имел корректную длину.

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

Обратите внимание, что использование трипланарного текстурирования может увеличить вычислительную наг
Думаю многие здесь поймут чего стоит потратить несколько дней на поиски решения возникшей проблемы, а в итоге столкнуться с собственной забывчивостью / невнимательностью / замыленным взглядом (нужное подчеркнуть). В моем случае проблемой оказался последний вариант. 
Что в основном проекте, что в специально созданном под поиск этой проблемы тестовом, я банально забыл пересчитывать касательные, и всего одна строчка RecalculateTangents решила все мои проблемы.
Считаю это замечательным окончанием дня... пойду разобью клавиатуру об лицо... или наоборот...
Всем желаю вовремя давать отдых глазам и мозгу.
Похожие вопросы