Создание процедурного материала дерева в Blender (Часть 1)

Создание процедурного материала дерева в 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 - для получения области воздействия на текущий материал. Возьмём градиент в форме сферы, чтобы имитировать объёмное вмешательсвто. Визуально это можно представить следующим как сферу с нашей пустышкой в центре:

Зелёный цвет - это нулевое воздействие (0)
Красный - максимальное (1)

Vector math - для математических вычислений над данными входящего вектора

В итоге вот такой нехитрой свзякой происходит преобразование вектора для внесения изменений через сторонний объект-пустышку:

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

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

И получаем в итоге вот такой результат:

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

Всем добра и удачи с деревяжкой=)

Report Page