Нормальный трипланарный маппинг в Blender
Злые языки поговаривают, что в Блендере нет нормального трипланарного маппинга. И эти претензии отнюдь не безосновательны. Ведь можно в настройках ноды текстур включить Box проекцию, но стоит только попытаться подвигать текстуру на свой вкус, как трипланарный маппинг тут же скукоживается.
Поэтому сегодня мы сделаем нормальный трипланарный маппинг в Блендере. И для этого нам понадобится совсем немножко шейдер нодов. Создадим новый материал и удалим всё лишнее. Затем добавим текстуру радиального градиента. И отколоррампим её так, чтобы радиальный градиент набегал с краев оси Y на края оси X.
Теперь нам нужна маска, с помощью которой мы этот градиент нарежем на кусочки, из которых потом соберем специальную квадратную маску для трех проекций текстур. Поэтому копируем ноду градиента и колоррампа. И переключаем колоррамп с линейной интерполяции на постоянную. Получается вот такая красивая маска.
Теперь эту маску нам нужно повернуть на ось X. Поэтому добавим ноду вектор ротате и поворачиваем маску.
Теперь из первого градиента отрезаем кусочки с помощью маски и ноды Math Subtract.
Теперь нам надо сделать регулируемый бленд, как в стандартной ноде текстур. Для этого добавим одну мапранже на выход нашей маски, а вторую мапранже на ноду валуе, через которую будем управлять силой размытия шва между проекциями текстур. Отмапранжированное значение валуя подаётся на мин и макс выходной мапранжы через пару матвычетаний со значениями 0.5001 и 0.5002. Почему именно такие значения? Это вам вопрос для самостоятельного изучения.
Теперь через нашу валую мы можем блендить края маски.
Какой же это бленд, если края острые? - спросите вы и будете неправы. Это бленд, но он пока спит. Мы еще разбудем чуть попозже. А пока нам нужно склеить квадратную маску. Поэтому добавим общий для всех градиентов вектор ротате, чтобы можно было поворачивать наши треугольнички. И засунем всё это в общий фрейм для красоты.
Теперь скопируем этот фрейм и повернем ее весь на 90 градусов по оси X.
Склеим наши два фрейма вместе с помощью Math Add. И в итоге у нас получилась одна проекция квадрата на нормали по оси Х!
Нам надо ещё две таких же проекции. Поэтому к нашим двум фреймам прикручиваем один общий вектор ротате, чтобы крутить квадрат во все стороны. И встраиваем наши два фрейма вместе с нодой вращения в ещё один общий фрейм для красоты.
Теперь копируем наш суперфрейм два раза. И поворачиваем второй суперфрейм на 90 по Z, а третий - на 90 по Y.
У нас получились квадратики для каждой оси! Разве это не прекрасно!? Этими квадратиками мы нарежем текстуры.
А чтобы нарезать текстуры квадратиками, их нужно добавить. Поэтому добавляем три текстуры и поворачиваем их так, чтобы одна смотрела в сторону Z, вторая - в сторону X, третья - в сторону Y.
Теперь нарезаем текстурки квадратиками. Текстуру с оси Z склеиваем с текстурой с оси X через маску-квадратик из суперфрейма с оси X. Результат смешиваем с текстурой с оси Y через маску оси Y. И в конце к результату приклеиваем еще раз текстуру с оси Z через маску оси Z. Зачем текстура с оси Z два раза? - спросите вы. Это единственный способ заткнуть дыры в бленде швов, который я смог придумать. ¯\_(ツ)_/¯
Готово! Теперь нашим валуем мы можем поблендить швы между проекциями!
Не блендится! - скажете вы. И будете правы. Ведь мы ещё не пробудили функцию бленда швов! Для этого нам надо отыскать во втором и третьем суперфрейме по паре нижних нод Math Subtract.
И переключить их с вычетания на сложение.
Швы сразу начнут блендиться в нужных местах! В ненужных - не будут. И можно будет, наконец-то, начать пользоваться нормальным трипланарным маппингом в Блендере! Как видите, ничего сложного. Делов на пять минут.
А если у вас ничего не получилось, то можете свериться вот с этой небольшой картинкой.
Вот и трипланарной сказочке конец. А кто слушал - молодец.