«Опять эти ваши программистские штуки! closures, bundles, DI, декларативная система... Я просто хочу сделать красивую симуляцию частиц, а не изучать Computer Science!»

Если эта мысль промелькнула в голове, когда вы услышали о Closures в Blender — вы не одиноки. Давайте разберёмся, почему разработчики добавляют в ноды сложные концепции и как это в итоге упростит жизнь именно 3D-художникам.

Тут новая версия Blender 5.0 вышла, на подходе (нужное подчеркнуть). Пока ребята на ютубе старательно игнорируют главные фичи новой версии (ACES и Closures), рассказывая о модификаторах и SDF, мы таки попробуем разобраться, что это, и главное, для чего это нашему брату, 3D-шнику?

Closures для 3D-художника? Что? Зачем?!

Tl;dr: Чтобы вы могли собирать сложные симуляции как конструктор, не понимая, как работает система внутри.

Чтобы понять, зачем нужны Closures, нам в статье на blog.blender.org прямо сразу начинают объяснять чем отличается императивный и декларативный подход. Если вы (вдруг) не знаете:

Императивный подход — подход «Как?»

«Сделай раз, сделай два, сделай три»

  • Вы описываете конкретные шаги вычислений: Возьми точки → примени гравитацию → проверь столкновения → обнови позиции → повтори

  • Аналогия из жизни: Вы готовите суп по рецепту, где нужно:

  1. Нарезать морковь

  2. Обжарить лук

  3. Сварить бульон

  4. Смешать ингредиенты

  5. Варить 30 минут

  • В Geometry Nodes сейчас: Вы — программист, пишущий алгоритм. Мощно, гибко, но требует глубокого понимания процесса.

Декларативный подход — подход «Что?»

«Я хочу вот это»

  • Вы описываете желаемое поведение, комбинируя готовые блоки: Частицы + гравитация + столкновения + столкновение с поверхностью

  • Аналогия из жизни: Вы заказываете пиццу по телефону:

  1. «Мне пиццу «Маргарита» с двойным сыром и оливками»

  • В Geometry Nodes с Closures: Вы — режиссёр, ставящий задачу. Просто, быстро, но требует готовых «ингредиентов» (спойлер: их пока нет).

Важно понять что и тот и другой подход — валидный. Вас не укусит программист (но это не точно), если вы выберете один подход вместо другого. Но, согласитесь, один способ выглядит проще?

Что такое Closures?

Если отбросить программистский жаргон: Closure — это «инструкция в конверте». Вы создаёте набор действий (например, «расставить точки на поверхности меша») — это ваша инструкция. Пакетируете её в специальной зоне — это «конверт». Передаёте этот конверт в сложную нод‑группу (например, «систему частиц»).

Зона Closure
Зона Closure

Система в нужный момент (когда нужно будет «добавить новые частицы») открывает конверт и выполняет вашу инструкцию.

Представьте нод‑группу «Генератор ландшафта», которая создаёт террейн и расставляет деревья. Старая версия позволяла расставлять деревья только определенным образом, давая возможность редактировать параметры такие как плотность деревьев.

С Closure автор группы может заменить внутренний алгоритм расстановки на нод Evaluate Closure и вынести этот Closure как вход группы. Теперь вы, как пользователь, можете:

  • Взять готовое поведение: Использовать стандартную случайную расстановку, которую предоставил автор.

  • Создать своё правило: Переопределить расстановку, поместив в Closure Zone свою логику (например, расставить деревья только на склонах определённой крутизны).

Это даёт невиданную гибкость. Вы можете кастомизировать внутренности сложных нод-групп, не разбирая их и не копируя:

Пример Closures с псевдо-генератором ландшафта.
Пример Closures с псевдо-генератором ландшафта.

Парадокс: усложнить, чтобы упростить

Да, это контринтуитивно! Но именно так работают все сложные системы, которыми мы пользуемся:

  • Автоматическая коробка передач сложнее механической, но водить с ней проще

  • Смартфон сложнее кнопочного телефона, но пользоваться им легче

  • Заказ такси через приложение сложнее, чем поймать на улице, но надёжнее

Разработчики создают сложный механизм Closures «под капотом», чтобы на поверхности остались простые и понятные инструменты.

Итеративная разработка: Фича есть, а революция — впереди

Здесь важно понять ключевой момент: Closures и Bundles в Blender 5.0 — это низкоуровневый фундамент. Тот самый декларативный решатель частиц, где вы комбинируете поведения "Эмиттер", "Гравитация" и "Столкновение", — это всё ещё план на будущее. Сам механизм (Closures) уже выпущен, а высокоуровневые инструменты на его основе (вроде декларативного Particle Solver) появятся позже.

Единственное, где можно потрогать Closures "из коробки" это модификатор Displace Geometry (единственный, про который не раскажут обзорщики на ютубе, т.к. у него доступна только нодовая версия):

Я добавил сглаживание между итерациями, даже не зная что там внутри Displace Geometry.
Я добавил сглаживание между итерациями, даже не зная что там внутри Displace Geometry.

В этом проявляется преимущество и недостаток итеративной разработки Blender:

  • Преимущество Фидбек от сообщества можно собрать максимально рано. Разработчики получают отзывы о стабильности и удобстве Closures до того, как на нём будут построены критически важные системы. Это позволяет «шлифовать» фундамент. Кроме того, продвинутые пользователи и разработчики аддонов уже сейчас могут экспериментировать и создавать прототипы.

  • Недостаток: Для большинства художников прямая польза от Closures пока неочевидна. Им приходится ждать, когда на этом фундаменте будут построены те самые удобные инструменты, которые обещают упростить им жизнь. Это может вызывать ощущение, что фича «сырая» или «не для всех».

Однако такой подход в духе Blender: сложные системы вводятся постепенно, что в долгосрочной перспективе приводит к более стабильным и продуманным результатам. Будущее, которое строят на этом фундаменте:

  • Input Widgets: Вскоре появятся виджеты вроде Color Ramp и Curve Mapping прямо на групповых нодах. Технически они будут реализованы как подтипы Closure, что решит давнюю проблему невозможности передавать такие данные в нод-группы.

  • Физические симуляции: Bundles — идеальный контейнер для упаковки всех данных симуляции (объекты, силы, ограничения). Внутренние эксперименты по созданию физических решателей, использующих bundles, уже ведутся.

  • Расширение на Shading и Compositing: Эти концепции не ограничены Geometry Nodes.

Вот на этом месте давайте конкретный пример. Недавно я сделал аддон ноды параллакс-маппинга.

Это идеальный пример, чтобы на нем разобрать что делает closures. (И это шейдерные ноды, так‑что это вдвойне интересно.)

Аддон решает классическую проблему в Blender: в шейдерные нодовые группы нельзя передать изображение как входной параметр. Почему? Потому что в шейдерах не просто ноды с картинками, а семплеры изображений. Хотя логически очень хочется иметь сокет для картинки, как в Geometry Nodes ну или, например, как в Unity. Но что имеем, то имеем. Мой аддон обходит эти ограничения таким образом: он под капотом создает копии нодовых групп, подставляя в них разные изображения.

Давайте попробуем сделать такой-же функционал с Closures. Основная группа нодов делает некоторую подготовительную работу, затем итерирует несколько раз нодовую группу, сдвигающую UV координаты. Чем больше итераций - тем точнее сдвиг.

Основная нодовая группа
Основная нодовая группа
Итерация
Итерация

Здесь мы заменим изображение на Evaluate Closure. А сокет Сlosure выведем наружу.

Кучу нодовых групп заменяем одной и кладем ее внутрь цикла Repeat. Количество итераций и closure выводим "наружу":

Затем создаем Closure зону с изображением внутри:

Скачать файл (Blender 5.0)

Теперь, если вам нужен еще материал с параллаксом, вы можете использовать эту же нодовую группу, подключив к ней другое изображение в зоне Closure. А значит, можно обойтись без аддона — всё делается штатными средствами Blender. Closures решили проблему, которая годами мучила нодовых колдунов. (Ну и Repeat zone тоже круто)

Конкретная цель: как Closures изменят интерфейс Blender

Разработчики Blender ставят четкую цель: создать ядро из Bundles, Closures и списков, которое позволит строить декларативные системы. Давайте посмотрим, как это будет работать на практике.

Архитектура будущего: поведенческие блоки

Представьте нодовый редактор, где слева находятся различные поведения:

  • Mesh Emitter (эмиттер из меша)

  • Gravity (гравитация)

  • Mesh Collider (столкновение с мешем)

  • Keep Distance (сохранение дистанции)

Все они подключены к одному мульти-входу нода Particle Solver. Ключевой момент: порядок подключения не имеет значения — система сама поймет, в какой последовательности применять поведения.

Простой UI для сложных систем: конец эре нодового редактора?

Самое интересное для обычных пользователей — возможность вообще не заходить в нодовый редактор для типовых задач. Если нод Particle Solver используется как модификатор, его интерфейс может выглядеть так:

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

Что в итоге?

  • Для художника: В будущем вы получите интерфейсы, где можно добавлять поведения частиц как слои в Photoshop. Сложные симуляции станут доступными без месяцев изучения нод. То, что сейчас требует глубоких знаний Geometry Nodes, будет собираться за несколько кликов.

  • Для продвинутых пользователей: Вы сможете создавать свои поведения и делиться ими. Сделали сложный эмиттер один раз — используете везде.

Спасибо, что дочитали до конца, надеюсь было познавательно. А если вам интересно не только почитать статьи, но и на мои рендеры посмотреть, заглядывайте в мой ТГ канал

Комментарии (1)


  1. Jijiki
    15.11.2025 12:30

    с частицами это вроде геометрический шейдер, суть в том что пускать частички в вертекс дороже, поэтому на частички создаётся геометрический конвеер. его суть в том, тут есть несколько подходов, самый простой это обновлять такой конвеер хотя бы на геометрическом(со всеми вытикающими с захватом преобразований), тогда такой конвеер принимает только точку, а обновление происходит по еммитеру, и вот на стадии еммитера мы создаём и текстуру, выход будет в другом шейдере, соотв надо просто подставить текстуру, тогда чтобы смещать, надо просто хранить отсечку смещения по атласу на частичке, ну да, чтоб такое сделать придётся в кс углубиться, кстати сейчас не знаю, когда в блендере тестил сцену с частицами было дорого, в движке подешевле выходит это, но переносить прям из блендера дорого, тоесть придётся писать свой скрипт к своему движку чтобы парсить поведение частички, и у меня вышло так, что если я кидаю модель тоесть преобразую частицы в мир(model *(aPos,1.0)), а не просто генерирую где нужно, это вызывает дичайшие задержки, а вот если отпустить свои 2000 000 частички и не подставлять модель, то на производительность рендера не сказывается и частички рисуются в ограниченных местах(скорее всего это подтип не контактных частиц типо VFX как я понял), всё что можно генерить можно нагенерить, но так-то это гемор да