Распродажа на Хэллоуин: −40% Pixor стоит $19.99 $11.99 до 4 ноября на itch.io →

Шейдер 3D-пиксель-арта для Godot 4

Кое-что нельзя запечь в спрайт-лист: целый 3D-уровень, транспорт, которым игрок рулит куда угодно, босса со ста позами. Pixor записывает свой облик как шейдеры Godot 4, так что всё это рисуется вживую теми же пикселями, что и ваши запечённые персонажи.

Кристаллический голем в облике selout: полосы света, палитра со сдвигом оттенка и выборочные обводки
Облик в Pixor
Нормали голема в виде цветов — данные, по которым шейдер реального времени считает свет
От чего шейдер считает свет: нормали

Два способа получить пиксель-арт в 3D-игре

Есть два распространённых способа сделать игру на Godot похожей на пиксель-арт. Первый — запекание: отрендерить каждого персонажа со всех сторон в спрайт-лист и проигрывать его в AnimatedSprite2D. Второй — рисовать саму 3D-сцену в низком разрешении через шейдер, который разбивает свет на полосы, ограничивает цвета и рисует обводки, а затем увеличивать её с фильтрацией nearest. Запросы «3D pixel art shader Godot» и «Godot 4 post processing pixel art» относятся ко второму.

У каждого свой смысл. Запечённые листы дают ручной контроль и возможность доработки, и ничего не стоят в отрисовке. Реальное время справляется с тем, что не вместит ни один лист: уровень, по которому движется камера, машина, поворачивающаяся под любым углом, сцена, где всё движется одновременно. Беда в том, что одно с другим редко совпадает: спрайты идут из одного конвейера, уровень — из отдельно написанного шейдера, и обводки, цвета и свет расходятся.

pxr shader решает это, записывая шейдеры Godot из того же Стиля, которым запекаются спрайты.

Запись шейдеров

Укажите модель и облик или проект, а также папку внутри вашего проекта Godot:

pxr shader knight.glb --preset selout --size 64 -o my-game/pixor
pxr shader game.pixor -o my-game/pixor --res res://pixor

-o — папка на диске; --res — та же папка в том виде, как её видит Godot, путь res://, если это не res:// и имя папки. В папке появляется пять файлов:

Файл Что делает
pixor_look.gdshader Материал. Каждый пиксель получает рампу своего цвета, ступень своей полосы света и блик, как у запечённого спрайта, в собственных цветах палитры. Он без затенения: облик и есть свет.
pixor_lines.gdshader Линии, экранный проход: силуэт на пустых пикселях вокруг модели и внутренние линии там, где одна поверхность стоит перед другой, в цветах линий Стиля.
pixor_view.tscn Пиксельная сетка: вьюпорт размером со спрайт, увеличенный в четыре раза с фильтрацией nearest, с камерой Pixor и линиями в нём.
pixor_look.gd PixorLook.apply($Level) придаёт облик каждой сетке под узлом, сохраняя цвет и текстуру каждого материала.
pixor_shader.json Размер, масштаб, палитра и то, что из Стиля шейдеры не включают.

Добавьте в сцену

  1. Скопируйте папку в проект Godot или запишите её туда сразу через -o.
  2. Добавьте pixor_view.tscn в главную сцену. Она рисует 3D-мир, в котором находится, через пиксельную сетку, с проходом обводки.
  3. Придайте сеткам облик. Из скрипта PixorLook.apply($Level) задаёт материал каждой сетке под узлом. Вручную поставьте pixor_look.gdshader на материал сетки.

Больше ничего настраивать не нужно: полосы света, рампы, палитра и цвета линий записаны в шейдеры. Чтобы изменить облик, измените его в Pixor и снова запустите pxr shader.

--view-scale задаёт, во сколько экранных пикселей превращается каждый пиксель арта (по умолчанию 4). Держите значение целым, как для любого пиксель-арта; почему, объясняет руководство по размерам спрайтов.

Чего не хватает в реальном времени

В реальном времени кадр рисуется так же, как запечённый, с тремя отличиями:

  • Нет отбрасываемых теней. Поверхности освещены и разбиты на полосы, но один объект не затеняет другой.
  • Нет линий между частями без разницы глубины. Две соприкасающиеся части, например рукав на руке, получают линию только там, где одна стоит перед другой.
  • Нет шагов по всему кадру. Шаги, читающие весь кадр или сравнивающие кадры, такие как очистки и помеченные так рисованные атомы, работают только при запекании.

Каждый узел Стиля сообщает, работает ли он в реальном времени: pxr nodes --graph style печатает под каждым «in real time: yes» или «not yet». Стиль, в графе которого есть узел, не работающий в реальном времени, отклоняется, и ошибка называет этот узел. Добавьте --partial, чтобы всё равно записать шейдер его настроек без этого узла.

Используйте оба способа

Сильнее всего работает сочетание обеих половин. Персонажей, которым нужны ручная доработка, много кадров и точные силуэты, запеките в листы (Pixor для Godot описывает SpriteFrames и готовую сцену). Мир, транспорт и всё слишком большое или свободное для запекания рисуйте через pxr shader. Поскольку оба способа идут из одного Стиля, у них общие рампы, полосы и палитра, и игрок видит одну игру, а не две.

Если спрайт должен реагировать на свет в 2D-сцене, набор света (--export light-kit) освещает запечённые спрайты по их картам нормалей в Godot, Unity или GameMaker, а каждый освещённый пиксель остаётся на своей рампе; см. освещение с правильной палитрой. Все параметры шейдеров реального времени описаны в разделе руководства.

Вопросы

Есть ли версия шейдера реального времени для Unity или Unreal?

Пока нет: pxr shader пишет только шейдеры Godot 4. Для Unity и GameMaker набор света Pixor освещает запечённые спрайты в движке по собственным ступеням палитры, с шейдером для каждого.

Совпадает ли облик в реальном времени с запечёнными спрайтами в точности?

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

Нужно ли настраивать параметры шейдера вручную?

Нет. Облик заложен в файлы шейдеров, сцена вида хранит камеру и проход линий, а PixorLook.apply задаёт материал каждой сетке под узлом, сохраняя цвет и текстуру каждой.

Что почитать дальше

Попробуйте на своей модели бесплатно в браузере или купите полную версию.

Попробовать в браузере Купить Pixor