Создание процедурных текстур в Blender

Все процедурные текстуры в Blender основаны на математике. Даже такие нерегулярные структуры, как Voronoi и Noise, на самом деле сгенерированы по четким математическим формулами. Внутри каждого базового нода из редактора материалов Blender зашит точный математический алгоритм, в результате работы которого и получается нужное изображение.

Задать подобный алгоритм в привычной математической записи в Blender нельзя. Однако среди прочих нодов Blender предоставляет пользователю ноды группы Math — оболочку над простейшими математическими операциями. С помощью этих нодов можно самостоятельно строить сложные математические алгоритмы, генерирующие интересные текстуры.

Для примера сгенерируем текстуру с изображением простого круга.

Подготовим сцену:

Добавим плоскость

shift+a — Mesh — Plane

на которую будем проецировать создаваемую текстуру. Назначим ей дефолтный материал. В редакторе материалов Node Editor, кроме уже имеющихся нодов, добавим ноды Texture Coordinates и Mapping:

shift+a — Input — Texture Coordinate

shift+a — Vector — Mapping

Соединим выход Object нода Texture Coordinate со входом Vector нода Mapping. Таким образом мы назначаем плоскости систему координат Object, что означает, что центр координат накладываемой текстуры будет совпадать с центом Origin плоскости, а координатные оси текстуры будут направлены так же, как оси плоскости.

Теперь обратим внимание на то, какими исходными данными мы располагаем. Это значения трех координаты X, Y и Z в трехмерном пространстве, которые мы получаем с выхода Vector нода Mapping.

Все процедурные текстуры — трехмерные и описываются не двумя координатами, а тремя. Поэтому в сущности нам нужно построить не круг на плоскости, а сферу в трехмерном пространстве. Сечение сферы по оси Z даст нужный нам круг.

Настало время взять в руки справочник по математике и поискать формулу, связывающую имеющиеся у нас данные о координатах X, Y и Z с необходимой нам формой сферы. Формула легко находится:

Теперь нужно воссоздать эту формулу при помощи нодов в редакторе Node Editor.

Добавим нод, разбивающий Vector на отдельные координаты X, Y, Z:

shift+a — Converter — Separate XYZ

и соединим его с нодом Mapping. Теперь мы имеем доступ к координатам, нужным для построения формулы.

Последовательно по действиям воссоздадим формулу при помощи нодов.

Добавим нод Math:

shift+a — Converter — Math

и переключим его в режим вычитания Subtract. В этом режиме из верхнего входящего значения нода вычитается нижнее значение. На верхний вход подадим координату X, нижний вход сделаем равным нулю (X0 = 0) чтобы круг строился из начала координат. Таким образом мы задали часть формулы X — X0.

Добавим еще один нод Math и переключим его в режим Power — возведение в степень. На верхний вход подадим значение Value нода Subtract, нижнее установим равным 2. Таким образом мы возводим X — X0 в квадрат.

Сделаем такие же группы для координат Y и Z.

Для того, чтобы сложить все три части уравнения, добавим еще два нода Math, переключив их в режим Add. Подключим к ним последовательно блоки для всех трех координат.

Подключим выход последнего нода на вход Color нода Diffuse и  в окне 3D_View перейдем в режим Rendered для просмотра результата.

Мы получили искомый круг, но он выглядит размытым. Это потому, что мы никак не ограничили правую часть уравнения — радиус.

Между нодом Duffuse и последним нодом Add вставим еще один нод Math и переключим его в режим Less Than. На верхний вход подадим значение нода Add, а второй установим равный 1. Теперь результат вычислений меньший единицы будет равен 1, а все, что больше — равно 0. Таким образом мы получаем точный процедурный круг с радиусом 1.

Итоговое дерево нодов выглядит так:

Для удобства можно объединить всю математику в группу

ctrl+g

и использовать получившуюся процедурную текстуру с кругом в своих рендерах.

Управлять расположением и размером круга также можно меняя значения в ноде Mapping.