Создание процедурной “молнии”
Hans Chiu поделился процессом создания процедурного анимированного шейдера “молнии”.
Hans Chiu поделился процессом создания процедурного анимированного шейдера “молнии”.
“Нодвембер” (Nodevember) – месячный челлендж, в ходе которого участникам предлагается каждый день создавать один процедурный объект для Blender. Это может быть материал, шейдер, объект, все, что угодно, лишь бы оно было процедурным. “Все, что состоит из нодов, все это – нодвембер”.
Сайт-визитка: nodevember.io
В официальной документации Blender приводится способ получения величины Specular, если известна величина IOR для отражений PBR-материалов. Для того чтобы получить значение Specular из значения IOR нужно воспользоваться формулой:
Эту формулу не сложно создать через ноды:
Преобразование индекса IOR в индекс Specular отраженийRead More »
В рендер-движке Cycles есть удобная возможность отрендерить объект с тенью на прозрачном фоне с помощью материала с функцией рендера только падающих на него теней “shadow catcher”. В рендер-движке EEVEE такой функции у материалов нет. Однако в EEVEE можно собрать свой “shadow catcher” на основе нодов.
Готовый материал “EEVEE Shadow Catcher” можно скачать в библиотеке BIS.
В Blender Cycles при использовании стандартных источников освещения типа Light можно освещать объекты, используя любую текстуру, а не только отдельный цвет.
Добавим в сцену любой объект, например сферу:
shift+a – Mesh – UVSphere
и назначим ей простой диффузный материал.
Одиночный процедурный элемент из библиотеки BIS можно легко превратить в равномерный повторяющийся паттерн.
Для примера загрузим из библиотеки круговой элемент и разместим его по центру объекта.
Градиент, помимо ноды “Gradient Texture”, можно получить с помощью достаточно простых формул. Рассмотрим математику на примере сферического градиента.
Создается на основе формулы конуса, направленного вершиной вниз.
В Blender 2.8 нодовый дисплейс в рендер-движке Cycles был изменен со скалярного на векторный. Если просто подсоединить черно-белую карту высот на вход Displace нода MaterialOutput, как это делалось в Blender 2.7, она не даст нужного результата.
Для того, чтобы нодовый дисплейс в Blender 2.8 рассчитывался корректно, нужно преобразовать карту высот в вектор с помощью двух нод: CombineXYZ и VectorDisplacement. Карту высот нужно подключить на вход Y нода CombineXYZ, а его выход Vector соединить со входом Vector нода VectorDisplacement. После чего соединить выход Displacement нода VectorDisplacement со входом Displacement нода MaterialOutput.
Если в панелях интерфейса аддона присутствует поле, значение которого меняет что-то в нодовом дереве, при изменении значения в этом поле нодовое дерево каждый раз перекомпилируется. Если пользователь меняет значение в таком поле зажав и двигая мышкой, слишком частая перекомпиляция нодового дерева приведет к заметным подвисаниям Blender.
Проблему лагов можно решить, используя декораторы для отложенного обновления нодового дерева.
Автор кода: Skarn
Декоратор для отложенного обновления нодового дереваRead More »
Класс для удобного создания нодов по их типу.
Автор кода: Skarn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class NodeTreeBuilder: def __init__( self , node_tree : bpy.types.NodeTree , x : float = -200 , y : float = -200 , delimeter : float = 300 ): self._x = x self._y = y self.tree = node_tree self.delimeter = delimeter self.purge_tree() def purge_tree(self): for node in self.tree.nodes: self.tree.nodes.remove(node) def add_node( self , node_type : str , node_name : str , column : int , row : int , node_descr : str = "" ): node = self.tree.nodes.new(node_type) node.name = node_name node.label = node_descr if node_descr else node_name node.location = (self.delimeter * column + self._x, -self.delimeter * row + self._y) return node |