Создание процедурного материала дерева в Blender (Часть 1)
Всем привет!
Я не раз встречал в тематических чатах вопросы, которые в той или иной степени связаны с процедурными материалами различной степени сложности. В цикле статей я постараюсь максимально комфортно донести до читателей процесс создания одного из самых распространённых и нужных материалов - это древесина. Итак - поехали=)
Давайте немного проанализируем что из себя представляет данный материал с точки зрения CG инструментария:
1) Структура
Я не буду вдаваться в такие вещи, как сорт, порода, возраст и прочее, так как это займёт уйму времени. Возьмём несколько простых референсов из сети:



Исходя из них можно определить следующие очевидные моменты:
а) Повторяющаяся структура различной частоты
б) Градиентные перепады
в) Мягкие структурные деформации
г) Круговой паттерн среза
Создание структурной маски
Теперь давайте попробуем реализовать это на уровне начинки шейдера. Начнём с создания ч/б маски. Я буду использовать Blender LTS версии 2.93 Создаём болванку деревянного бруска из обычного куба к примеру, только следим за масштабом - это важно:

Далее создаём материал. Внутри редактора шейдеров добавляем узел входных координат для текстур (Texture Coordinate), узел преобразования координат (Mapping) и, чтобы закрыть два пункта сразу - узел Wave Texture c алгоритмом Rings. Вывод фактора подсоединяем напрямую к входу Surface. Кому то это покажется странным, но на данном этапе мы создаём всего лишь маску структуры, поэтому задействование какого-то определённого шейдера здесь не играет никакой роли.
После всех манипуляций получаем что-то вроде этого:

Не красиво и не понятно? Верно. Исправляемся
1) Меняем подачу текстурных координат на Object - У нас ведь как никак процедурность и жёстко привязываться к UV координатам объекта нам не стоит
2) Меняем направление текстуры таким образом, чтобы срез у нас находился там где положено, то есть на торцевой части нашего бруска. Это можно сделать переключив ось в узле Wave texture.
Внимание! Если у Вас он уже там, где положено, то значит первоначально изменение куба Вы производили по другой оси и это ничего страшного.
В итоге у Вас должно получится что-то вроде этого:

3) Далее усиливаем частоту повтора колец и придаём небольшую деформацию нашему срезу, используя следующие параметры узла Wave texture:

Scale - Масштабирует текстуру относительно входных координат
Distortion - Искривляет кольца в хаотичном порядке
Detail - Уровень детализации параметра Distortion
Detail Scale - Масштабирует параметр Distortion по контуру колец
Оставшиеся параметры мы будем использовать тоже, но пока о них не стоит разговаривать.
Поиграйтесь с настройкой узла для получения результата по вкусу. При последующем усложнении материала мы к ним не раз будем возвращаться для получения более лаконичного соотношения параметров. На текущий момент у Вас должно получиться что-то вроде этого:

Давайте теперь проработаем структуру волокн в глубь относительно среза. На данный момент она у нас не корректна, так как идёт одинаковое масштабирование по всем осям. Чтобы это изменить воспользуемся предыдущим узлом Mapping и убавим значение Scale по оси Y до приемлемого результата:

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

А в ноды нашего материала дерева дополнительный следующие узлы: Texture coordinate, Mapping, Gradient texture, Combine XYZ и Vector math
Texture coordinate - для получения входных координат от положения нашей пустышки (канал Object и в поле Object указать наш объект-пустышку)
Mapping - для манипулирования координатами, полученных от положения объекта-пустышки
Gradient texture - для получения области воздействия на текущий материал. Возьмём градиент в форме сферы, чтобы имитировать объёмное вмешательсвто. Визуально это можно представить следующим как сферу с нашей пустышкой в центре:
Красный - максимальное (1)
Vector math - для математических вычислений над данными входящего вектора
В итоге вот такой нехитрой свзякой происходит преобразование вектора для внесения изменений через сторонний объект-пустышку:

Далее эту связку узлов мы направляем в канал Location узла Mapping, который получал входные координаты от нашего бруска, а так же визуально настраиваем по вкусу данные узлов от входных координат объекта-пустышки и положение/масштаб самого объекта пустышки. У меня это вышло так и я думаю у Вас будет нечто похожее:


Теперь давайте добавим тем же методом дополнительные деформации структуры, чтобы в бОльшую сторону уйти от однородности. Для этого добавляем ещё объектов-пустышек и просто копируем ветку узлов от объекта первой пустышки до корневого узла Mapping, меняя объекты в узле Texture coordinate на новые пустышки и последовательно соединяя ветки через дополнительный узел Mapping, где в качестве входных координат будет использоваться предыдущая ветка, а в качеств Location - каждая следующая:

И получаем в итоге вот такой результат:
На этом пока всё. В следующей части мы будем усложнять нашу процедурную маску присущими древесине деталями, такие как сколы, трещины и т.п.
Всем добра и удачи с деревяжкой=)