Командная строка

pxr рендерит те же спрайты, что и приложение (один и тот же проект дает одни и те же пиксели), и подходит для скриптов сборки и пакетной работы. pxr help выводит все команды и параметры, pxr help COMMAND — одну команду с ее параметрами, а pxr --version — версию. Если командную строку не удается прочитать, команда сообщает, что не так, как используется эта команда, и предлагает посмотреть pxr help COMMAND.

Частые задачи

# One sprite, 64 px, three-quarter view
pxr render knight.glb -o knight.png

# Every clip, 8 sides, 12 fps, all export formats
pxr render knight.glb --clip all --ring 8 --export all -o out/knight.png

# Two clips, hand-picked frames for the attack
pxr render knight.glb --clip walk --clip attack --keys 0,0.2,0.35,0.6 -o out/knight.png

# A different look
pxr render knight.glb --preset selout --view isometric --light -30,50 --bands 4 --aa 1 -o knight.png

# Your palette
pxr render knight.glb --palette my-palette.hex -o knight.png

# Save the settings as a project, then render it again later (or open it in the app)
pxr render knight.glb --clip all --ring 8 --export aseprite -o out/knight.png --save-project knight.pixor
pxr render knight.pixor

# A whole folder, every clip of every model, with a report
pxr batch models/ --recursive -o out/ --ring 8 --export all

Проект — это собственный рецепт: при рендере облик и сцена читаются из него, а из командной строки берется только то, куда идут файлы (-o, --export, --names, --scale, --anim-scale, --no-recipe, --debug), дополнительные слои (--paper-doll, --piece, --parallax, --haze), бэкенд и то, какой конвейер ассета записывать. Любой другой флаг упоминается в предупреждении, так как ничего бы не изменил: задайте его в проекте через pxr project set.

Какой конвейер ассета. pxr render project.pixor записывает первый конвейер ассета проекта, так же как окно экспорта приложения записывает выбранный в нем, который сначала совпадает с выбранным в заголовке; --pipeline NAME записывает другой, а --pipeline all — все. Файл называется одинаково, какой бы конвейер ни записывался, поэтому --pipeline all записывает ровно те же файлы, что конвейеры по отдельности. pxr names, pxr watch и pxr run тоже принимают --pipeline.

Куда идут файлы. -o PATH (или --out PATH; каждая команда принимает оба) — место, куда пишет команда. Для команды, которая пишет один файл, — render, stylize, effect, voxels, tiles, shapes, rebake, project blueprint, project set (лист проекта), — это сам файл или папка, в которую файл попадает под своим именем, если путь заканчивается на / или это существующая папка: pxr render knight.glb -o out/ записывает out/knight.png. Проект, отрендеренный с -o, записывает все файлы в эту папку (D51): ею становится папка листов проекта (по умолчанию out/), путь внутри нее сохраняет свое место ниже, а любой другой путь — свою последнюю часть, включая архивы, анимации и иконки. Окно экспорта приложения выполняет ровно pxr render PROJECT --pipeline NAME -o FOLDER на копии проекта в том виде, в каком он открыт, сохраненном или нет, и названной как проект; --recipe-project FILE.pixor (или none для проекта без названия) — то, что рецепт копии называет вместо самой копии. Команды, которые пишут много файлов, — batch, golden, gbuffer, stages, icons, run --jobs — принимают папку.

Файлы клипов рядом с моделью с именем <model>@<clip>.<ext> добавляются автоматически. Другие файлы с тем же скелетом можно добавить через --anim FILE.

Команды

Команда Операция
pxr render MODEL | PROJECT.pixor спрайт или лист, если запрошены клипы, стороны или действия; проект записывает по листу на каждую группу камер, кадрируемых вместе
pxr stages MODEL -o DIR изображение каждого этапа конвейера (альбедо, нормали, глубина, покрытие, свет, полосы, ребра, линии, очистка, проверка…), --only edges,lines — для некоторых; --node N вместо этого записывает то, что создает узел N графа стиля, как KIND.still.png (экран CRT): неподвижный кадр, никогда не спрайт и не лист
pxr batch FOLDER -o DIR все модели в папке (.gltf, .glb, .fbx, .obj, .vox; --recursive — с подпапками); о неудачных моделях сообщается, и они пропускаются; DIR/report.json; --blueprint B.pixorblueprint прогоняет каждую модель через один шаблон проекта; --cache DIR отдает модели, которые не изменились (см. библиотеки). В приложении перетащите папку на окно
pxr run BLUEPRINT.pixorblueprint --in model=M шаблон проекта с заполненными входами (см. граф сцены); --set NODE.SETTING=VALUE меняет один параметр, --set PIPELINE/NODE.SETTING=VALUE — то же только в одном конвейере (--set hold.times=4 — узел «Удержание» каждого конвейера ассета); --jobs TABLE.csv -o DIR выполняет по одной строке таблицы на рендер; --pipeline NAME|all — как для render
pxr rebake SHEET.aseprite отрендерить проект заново в лист, на котором вы рисовали, сохранив ваши слои и правки (см. Aseprite)
pxr cache stat|gc DIR что хранит кэш; gc --keep 20GiB удаляет давно не использовавшиеся рендеры, пока кэш не уложится в объем
pxr golden CASES.txt рендерить тестовые случаи и сравнивать с сохраненными изображениями (см. ниже); --only TEXT запускает случаи, в имени которых есть этот текст, --tolerance F допускает долю F отличающихся пикселей, -o DIR (по умолчанию target/golden) — куда идут результаты; --graph вместо этого рендерит их через граф узлов облика — пресета в виде поставляемой группы Пикселизация, — а --flat — через тот же граф, где каждая группа развернута до атомов; оба должны совпадать с теми же изображениями. --cache DIR записывает спрайт каждого случая в --out через кэш и сравнивает этот файл, отданный из кэша или отрендеренный; --no-cache записывает те же файлы без кэша
pxr bench MODEL измерить каждый бюджет в tests/budgets.txt и сообщить met или MISSED; --rounds N (по умолчанию 10) усредняет время по N запускам; --from INFO.json добавляет то, что измеряет приложение
pxr import MODEL --report что происходит с файлом при импорте, без рендера: что найдено, что исправлено и почему, что рекомендуется, чего не хватает, треугольников на пиксель спрайта; --json — для пакета, который сначала находит сломанные файлы
pxr reference SPRITE.png параметры, считанные со спрайта, который у вас есть: палитра, размер, обводка, полосы, сдвиг оттенка, дизеринг, каждый с объяснением; pxr project set P --match-sprite S.png их задает
pxr voxels MODEL -o OUT.vox модель в виде вокселей, высотой --height (от 1 до 256), в палитре облика: файл MagicaVoxel; --stack записывает также стопку спрайтов (см. Воксели и стопки спрайтов)
pxr nodes [--graph G] [--json] все узлы четырех графов (стиля, действия, сцены, ассета) в том виде, в каком они есть в этой версии Pixor: что узел делает, что принимает и выдает, каждый параметр с диапазоном и значением по умолчанию; --json — для инструментов (справочник узлов на сайте собирается из него)
pxr inspect FILE что импортер нашел в любом файле, который импортирует Pixor (форматы, также в pxr help inspect): для модели — объекты, материалы, кости, клипы, предупреждения; для .vdb — его сетки и их размер; для изображения — его размер; для палитры — ее цвета
pxr gbuffer MODEL -o DIR сырые цели рендера для отчетов об ошибках; дамп .pxrg содержит ребра меша, если облик их рисует
pxr stylize DUMP.pxrg выполнить пиксельные проходы над сохраненным рендером, включая каркас
pxr diff OLD NEW две папки экспорта (или два листа): какие файлы новые, исчезли или отличаются, на сколько пикселей и, по рецепту каждого файла, какой параметр или вход это вызвал; --all перечисляет и одинаковые файлы, --exact завершается с кодом 1 при любом изменении. Два дампа .pxrg сравниваются цель за целью (--depth-tolerance EPS, --samples N)
pxr adapters GPU, которые может использовать Pixor
pxr doctor чем эта машина может рендерить и согласуется ли ее GPU с эталоном на CPU
pxr project new|set|show PROJECT.pixor создать, изменить или вывести проект из сценариев и инструментов: --name NAME дает ему имя (имя в заголовке, а не имя файла; show выводит его вместе с остальным)
pxr project key PROJECT.pixor TARGET CHANNEL один ключ клипа, созданного в Pixor (--clip, --frame, --value, --how, --remove…), чтобы сценарий мог собрать клип
pxr project bake PROJECT.pixor CLIP собственный клип модели как клип, созданный в Pixor, с ключом на каждой кости в каждом кадре (--as NAME, --fps F)
pxr project scene PROJECT.pixor [NODE] граф сцены по одному узлу: ring, row, grid, scatter, look-at, vary… добавляются в конец цепочки, а опции каждого узла названы по его параметрам (--count, --radius, --size у Vary, --box у Scatter, --bumps у Displace и --hills у Height field в метрах, --times у Subdivide, --how у Select); узел, который ничего не принимает (object, import), начинает цепочку вместо голого импорта, а рядом с более длинной цепочкой встает отдельно, слитый с ней; без узла выводит граф
pxr project blueprint PROJECT.pixor -o B.pixorblueprint проект как шаблон проекта, где его модель, палитра, файлы реквизита и объемов вынесены в именованные слоты
pxr style new KIT --from PROJECT сохранить первый Стиль проекта как набор Стиля
pxr kit show FILE.pixorkit что содержит набор: группу узлов, Стиль, пресет или конвейер
pxr names PROJECT.pixor [--names T] [--pipeline NAME|all] имена, которые запишет проект, и идентификатор каждого кадра, без рендера, файлы каждого рендера по их собственному пути; два кадра на одно имя, два рендера на один файл (would be written twice) или два файла на один путь (основа бумажной куклы и основа набора света, вариант палитры и слой) — это ошибка здесь, а не потерянный файл позже
pxr graph list|set|add|drop|wire|save|swap|flatten|extra FILE --which scene|action|style|asset любой из четырех графов из сценария. --pipeline NAME выбирает, какой: действие по имени, Стиль или конвейер ассета, первый, если имя не задано. Выведите его, измените один параметр, добавьте узел в цепочку (или рядом с ней с --alone, подключая к нему другие через --in SLOT=NODE), удалите узел, соедините два с помощью wire --from N --to M --slot S, сохраните как набор (save -o KIT.pixorkit: граф стиля целиком, граф сцены, действия или ассета как один узел, --as-pipeline — целый конвейер ассета, который другой проект использует через pxr project set --use-pipeline), вставьте набор узлов как группу (add --kit KIT) или вместо узла (swap --kit KIT) либо выпишите граф с раскрытыми группами; extra --node N --name LAYER делает изображение узла стиля еще и слоем экспорта, а --drop это отменяет. --node (и --set NODE.SETTING в pxr run) называет узел по номеру, виду, имени группы, по тому, что написано в его поле Название (у файла изображения, у листа), или по имени, данному ему в приложении (F2); узел object — это модель (of=model), а предмет, фигура или изображение — отдельные узлы. Узлы sprites, frame-range и hold графа ассета настраиваются как любые другие (--node sprites --set action=walk,Static — action=every-one-except-static у нового узла, action= — все действия, включая Статику, — --set smart=6, --node frame-range --set from=2 --set to=5, --node hold --set times=2); узлы действия — clip, bob, spin, merge… — по виду или номеру, и добавленный без --alone сразу играет, слитый с тем, что там есть. В графе стиля узел добавляется ни с чем не соединенным, --in SLOT=NODE и wire подключают его. Правка, после которой граф не смог бы работать, отклоняется, а файл остается как был (см. граф сцены, граф ассета и узлы)
pxr shapes [PROJECT] -o OUT.glb выписать фигуры, построенные в приложении, в виде геометрии, для редактора моделей или движка
pxr icons MODELS... -o DIR иконки инвентаря с атласом на каждый размер; редкость берется из имени каждого файла, а --save сохраняет рецепт для повторного запуска (см. Экспорт)
pxr audit FILE|FOLDER... [--style KIT] проверить, что экспортированные листы согласованы: пресет, схема освещения, вид, наклон, свет, полосы, линии, палитра и пиксели на метр — по рецепту каждого файла, а с набором Стиля — что каждый цвет есть в его палитре (иначе код выхода 1)
pxr watch PROJECT.pixor экспортировать снова всякий раз, когда меняется проект, его модель или палитра
pxr effect KIND[:FRAMES] отдельный пиксельный эффект: explosion, hit-spark, slash, magic-burst, heal, portal, smoke-puff, dust, fire-loop, rain, snow, fireflies, falling-leaves
pxr console list|check SHEET.png режимы консоли или то, подходит ли лист под один из них (иначе код выхода 1); консоль берется из --console или из рецепта листа

Параметры рендера

Вариант По умолчанию
--view VIEW пресета side, three-quarter, isometric или top-down
--pitch DEG вида градусов ниже горизонта
--yaw DEG 0 повернуть отдельный спрайт или единственную сторону листа из одного спрайта
--camera GENRE камера игры: platformer, fighting, beat-em-up, adventure, top-down-rpg, action-adventure, isometric, tactics, strategy, racing, top-down-shooter, shmup, icon (вид, наклон, поворот; размер и стороны, если не заданы)
--camera-yaw DEG 0 вращать камеру вокруг модели, все стороны
--size N 64 вписать в N x N, от 4 до 2048; --size 960x540 вписывает в холст такой ширины и высоты (заглавное изображение, фон)
--pixels-per-metre F фиксированное число пикселей на метр вместо --size, от 0.5 до 4096 (Пикс./м в приложении)
--up AXIS определяется при импорте ось, которая в файле направлена вверх (y, z, -z, x, -x, -y): для модели, экспортированной лежа
--import-scale F, --import-offset X,Y,Z определяется при импорте юнит и ход, заданные вручную
--no-import-fix отрендерить файл в точности как есть, ничего не исправляя
--samples N 4 выборок на пиксель по каждой стороне, от 1 до 8 (Примеры в приложении)
--light AZ,EL -45,45 ключевой свет относительно камеры
--light-space S камера world: свет остается на месте в сцене, а не следует за камерой
--fill F пресета сила заполняющего света, от 0 до 1
--no-shadow без отбрасываемых теней
--bands N пресета полосы света, от 1 до 4
--palette P файл .hex, .gpl или .png либо встроенная палитра: pixor-16, pixor-8, dusk-12, forest-12, desert-12, ice-10, mono-8
--aa N 0 сглаживание: 0 — выкл., 1 — силуэт, 2 — каждая линия
--match-space S oklab как цвета находят ближайший в фиксированной палитре: oklab, srgb или weighted
--dither-pattern P bayer bayer (перекрестная штриховка) или blue-noise (равномерно рассеянный); оба остаются на поверхности, когда модель движется
--even-stairs выкл. прямые края силуэта с равными ступенями (2, 2, 2, а не 3, 1, 2)
--smear PX 0 кадры смазывания, от 0 до 64: то, что сдвинулось на PX пикселей или больше с предыдущего кадра, оставляет шлейф
--nudge X,Y 0,0 сдвинуть модель на долю пикселя по сетке (каждая ось от -0.5 до 0.5); меняется только выборка
--foot-plant выкл. опорные ступни гуманоида на одной и той же строке пикселей в каждом кадре клипа
--preset NAME чистый clean, selout, retro4, flat, wireframe или сохраненный набор пресета (.pixorkit)
--style KIT набор Стиля (.pixorkit): целый Стиль (pxr style new, «Сохранить набор…» у Стиля), вместе с его графом стиля, или только граф стиля (pxr graph save --which style); последующие флаги все равно его меняют. В файле эталонного случая — относительно этого файла. pxr icons и pxr audit принимают то же
--dither F 0 упорядоченный дизеринг между соседними полосами света, от 0 до 1
--line-colour HEX пресета цвет линий Dark, #rrggbb (только для автоматических палитр)
--no-lines MATERIAL без линий вокруг этого материала (можно повторять; pxr inspect их перечисляет)
--crease-angle DEG 55 насколько острая складка рисует линию сгиба, от 1 до 179
--depth-step PX 2.5 перепад глубины в пикселях, рисующий внутреннюю линию, от 0.1 до 40 (Перепад глубины в приложении)
--shortest-line N 3 кратчайшая сохраняемая внутренняя линия или линия сгиба, от 0 до 16 пикселей (Кратчайшая линия в приложении)
--no-part-lines без линий между соприкасающимися частями без перепада глубины
--outline-inside силуэт на собственном краю спрайта
--convex LINE нет светлая линия на складках, выпирающих к камере: none, dark или highlightN
--no-material-channels игнорировать металличность, шероховатость, свечение, unlit и прозрачность материала glTF и затенять только по его цвету
--backend B авто auto, vulkan, metal, dx12, gl, webgpu или cpu (см. Выбор рендерера)

Параметры света и цвета

Вариант
--rig NAME схема освещения: noon, dusk, torchlight, moonlight или studio
--cycle MATERIAL зациклить цвета этого материала в действии --colour-cycle (можно повторять)
--team MATERIAL|#RRGGBB цвет команды: материал или все рампы оттенка этого цвета (можно повторять); --variant team:blue перекрашивает только его
--console C режим консоли: gameboy, nes, pico8, tic80, c64 (см. Режимы консоли)

Параметры анимации

Вариант
--clip NAME клип для рендера (повторите для нескольких) или all
--anim FILE также использовать клипы из FILE
--ring N стороны против часовой стрелки от передней (от 1 до 64, по умолчанию 1), с именами South, Southeast, East…: по камере на каждую, с общим размером, в одном листе
--sides A1,A2,... сторона на каждый угол вместо этого, в градусах (0 — спереди, 90 — смотрит вправо)
--fps F кадров в секунду времени клипа (по умолчанию 12) — нарезка каждого узла «Спрайты»
--keys T1,T2,... выбранные вручную моменты клипа, в секундах, — нарезка каждого узла «Спрайты»
--clip lib:NAME клип библиотеки движений, подогнанный под скелет модели: idle, walk, run, jump, attack, hit, death
--parallax N разделить изображение по глубине на N слоев (2–8) для прокручиваемых фонов (см. Сцены из нескольких моделей)
--haze #RRGGBB цвет, к которому затеняются дальние слои параллакса; none оставляет каждый слой на палитре как есть
--spring NODE[:S,D,G] NODE и все ниже него качаются с движением: жесткость, затухание, гравитация (можно повторять); в проекте — узел Spring графа сцены
--smart-frames N оставить N кадров каждого клипа, выбранных из его поз (каждый удерживается до следующего), — нарезка каждого узла «Спрайты»
--root-motion M keep (по умолчанию), in-place (закрепить корневую кость по горизонтали) или in-place-sway (убрать только итоговое перемещение клипа)
--turntable N добавить действие из N кадров, поворачивающее модель на один оборот
--turntable-seconds S сколько длится этот поворот (по умолчанию: N кадров при --fps)
--motion M[:N[:A]] добавить цикл: spin, bob, swing, pulse, squash или flicker, N кадров, сила A (для spin — доля оборота, которую делает цикл: spin:8:0.125 поворачивает самоцвет с восемью гранями на одну грань — бесшовный цикл)
--colour-cycle N добавить действие из N кадров, поворачивающее оттенки циклических материалов
--prop FILE:BONE[@at=X,Y,Z][@turn=X,Y,Z][@scale=S][@grip=NODE] прикрепить другую модель к кости, которую та держит за grip, перемещая и поворачивая ее по осям кости (см. Реквизит на костях)
--shape SPEC добавить фигуру: [NAME=]KIND[:SIZE[:AT[:#RRGGBB[:TURN]]]], например box:1,0.5,1:0,0.25,0:#c86432 или wheel=cylinder:0.5,0.2,0.5:0.7,0.25,0.5:#14101c:90,0,0 для именованного колеса, лежащего на боку (можно повторять). KIND — это box, sphere, cylinder, cone, torus, plane, capsule, wedge, pyramid, prism, stairs, arch или letters (pxr help render перечисляет их из того же списка, который читает флаг): letters — пиксели шрифта, выдавленные в блоки, складывающиеся в PIXOR, или в слова проекта, pxr project set --add-shape letters --words WORDS --font NAME (render не принимает --words)
--volume SPEC добавить объем: puff, flame, cloud, mist или путь к .vdb, затем [:SIZE[:AT]], затем [:FRAMES[,EVERY[,LOOP]]] для нумерованной последовательности .vdb, затем @BONE, чтобы его несла кость, или @effect:N — излучатель N-го эффекта (Объемы)
--wire LINE облик каркаса: none, dark или seloutN, с --wire-fill, --wire-hidden, --wire-angle (от 0 до 180), --wire-all-edges и --wire-glow MATERIAL (параметры)
--light-sweep N добавить действие из N кадров, двигающее свет
--effect KIND[:N] добавить действие пиксельного эффекта из N кадров (см. pxr effect) с --effect-size, --effect-energy, --effect-seed, --effect-at X,Y,Z, --effect-bone BONE, --effect-clip CLIP, --effect-hit FRAME и --effect-alone
--hitbox PART, --hurtbox PART, --socket BONE коробки и положения костей на каждый кадр в JSON (можно повторять; см. Экспорт)
--paper-doll, --piece NAME:PARTS слои бумажной куклы (см. Экспорт)
--item MODEL@X,Z[,YAW,SCALE[,LAYER]][:CLIP[,PHASE]], --ground W,D[,#RRGGBB] дополнительные модели рядом с первой, каждая — узел «Предмет» графа сцены в проекте, а под ними плоскость земли (см. Экспорт)
--chunks COLSxROWS записать большую карту фрагментами с точными швами; --chunk-margin N (по умолчанию 8)
--max-flicker F предупреждать, если доля мерцания выше этой (например, 0.01); в эталонном случае — ошибка
--require-visible OBJECT предупреждать, если OBJECT исчезает в каком-либо кадре

Параметры экспорта

Вариант
--export LIST через запятую или повторением: png, json, aseprite, normal, depth, emission, layers, palette, godot, gif, apng, light-kit, p8, report, video или all (все, кроме p8 и video, которые записываются только если названы); PNG записывается всегда (см. Экспорт). render, batch, run, watch, project set и tiles (со своими форматами) читают его так же
--layout L сетка (строка на каждое действие и сторону, по умолчанию) или полоса
--padding N прозрачные пиксели между ячейками, от 0 до 256 (по умолчанию 0)
--extrude N повторять края ячеек на N пикселей наружу, от 0 до 64 (по умолчанию 0)
--pot размер листа — степень двойки
--godot-path RES где Godot находит лист (по умолчанию res://<png name>)
--anim-scale K целочисленный масштаб файлов GIF и APNG, от 1 до 16 (по умолчанию 1)
--video-scale K, --video-fps N, --video-background #RRGGBB как записываются видео: масштаб от 1 до 16 (по умолчанию 4), от 1 до 100 кадров в секунду (по умолчанию 30), поверх чего рисуется спрайт (по умолчанию черный)
--trim обрезать каждую ячейку до ее пикселей (JSON и файл Godot сохраняют размещение)
--dedupe хранить одинаковые кадры один раз
--max-width N начинать новую строку, прежде чем лист станет шире N пикселей (от 0 до 65536; 0 — без ограничения)
--columns N N кадров в ряду, каждый клип продолжается после предыдущего: контактный лист
--max-height N разбить лист выше N пикселей на страницы, целыми клипами на страницу (NAME_1.png, NAME_2.png; от 0 до 65536)
--variant NAME также экспортировать вариант палитры (можно повторять): эффект вроде hit-flash или night, hue:DEG, team:COLOUR (имя или #rrggbb; нужен --team) или palette:NAME|FILE; добавляет лист индексов и текстуру-таблицу
--shadow KIND также записать name_shadow.png: contact или drop
--names TEMPLATE как называются файлы и ключи JSON: шаблон из {project}, {object}, {action}, {side}, {layer}, {set}, {size}, {index} и {ext}, где {index:3} дополняется до трех цифр (см. Экспорт)
--no-recipe не сохранять рецепт (как был сделан лист) в PNG и .aseprite
--scale K увеличить PNG в K раз (только для превью; не с другими форматами)
--save-project FILE.pixor также записать эту командную строку как проект
--debug DIR цели рендера, палитра, изображения проверки и мерцания

Эталонные тесты для вашего собственного конвейера

Файл cases перечисляет по одному рендеру на строку: имя, путь к модели или проекту (относительно файла) и параметры.

hero-walk   models/hero.glb --clip walk --ring 8 --max-flicker 0.02
hero-proj   hero.pixor

pxr golden cases.txt --bless сохраняет результаты как NAME.png рядом с файлом; затем pxr golden cases.txt завершается ошибкой, если меняется хоть один пиксель, если линтер находит проблемы в спрайте (одиночные пиксели, L-образные углы линий, линии по 2 px) или если не проходит проверка --max-flicker или --require-visible; ошибка сообщает, у каких случаев отличаются пиксели (их NAME.actual.png и NAME.diff.png лежат в target/golden) и какие не прошли проверки. --bless сохраняет изображения, даже если проверка не прошла, и завершается с кодом 1, называя эти случаи. Используйте это, чтобы замечать, когда изменение модели меняет ваши спрайты.

Библиотека, а не прогон

Студия заново рендерит те же пять тысяч спрайтов, потому что сдвинулась одна рампа. Три вещи превращают это в осознанное решение, а не в работу на всю ночь.

Кэш, который переживает процесс. --cache DIR в pxr batch и pxr run сохраняет каждый сделанный рендер вместе с прочитанными файлами и хешем их содержимого: модель, файлы клипов рядом с ней, текстуры, на которые ссылается .gltf, палитры, наборы, изображения и объемы. Следующий запуск отдает каждый рендер, чьи файлы дают тот же хеш, и рендерит остальное.

pxr batch models/ --cache .pxrcache --out out/     # renders what changed
pxr cache stat .pxrcache
pxr cache gc .pxrcache --keep 20GiB                # least recently used go first

Кэш никогда не является источником истины: --no-cache дает те же байты, сохраненный файл, хеш которого не совпадает с его именем, рендерится заново, а не отдается, а новая сборка Pixor начинает новый кэш, а не доверяет старому.

Файл задания. Таблица с одной строкой на рендер, одним столбцом на слот шаблона проекта и, по желанию, столбцами name (папка строки), out (ее лист внутри --out) и NODE.SETTING (--set для этой строки):

model,name,palette,sprites.fps
heroes/knight.glb,knight,palettes/steel.hex,8
heroes/mage.glb,mage,palettes/robes.hex,

Здесь sheet.pixorblueprint получен командой pxr project blueprint sheet.pixor из проекта с heroes/knight.glb и палитрой, поэтому его слоты — model и palette; рыцарь нарезается с частотой 8 кадров в секунду, а маг, у которого ячейка пуста, — с собственной частотой шаблона проекта. Каждая строка записывает out/NAME/NAME.png.

pxr run sheet.pixorblueprint --jobs assets.csv --cache .pxrcache --out out/ --jobs-report report.json
pxr run sheet.pixorblueprint --jobs assets.csv --cache /shared/cache --out out/ --rows 400..   # the second machine, of 800 rows

Пути указываются относительно таблицы. Строка — это ровно pxr run с добавленными --in и --set этой строки, поэтому неудачную строку можно запустить отдельно. Сбой одной строки никогда не останавливает остальные: отчет перечисляет каждую строку — отрендерена ли она, взята из кэша или завершилась сбоем и почему, — и задание в конце завершается с кодом 1, если сбой был.

Бюджеты как флаги. --max-pixels N, --max-memory SIZE и --max-time DURATION действуют на рендер (на строку, на модель). То, что план уже знает, — сколько пикселей будет в листе, примерно сколько памяти он займет, — проверяется до того, как что-либо нарисовано; время и память проверяются между кадрами. Превышение завершает работу с кодом 6, указывая, что превышено и где остановилось; в задании строка завершается неудачей с этой причиной, а остальные продолжаются.

pxr run sheet.pixorblueprint --jobs assets.csv --out out/ --max-memory 1.5GiB --max-time 5m --max-pixels 16M

Длинные клипы. Кадры клипа рисуются, а затем доводятся вместе, потому что проходы, которые не дают клипу мерцать, смотрят вдоль него. То, что они читают, держится в пределах 512 MiB (половина --max-memory, если он задан), по несколько сторон за раз; клип, слишком длинный даже для одной стороны, хранится на диске, пока рисуется, — в ~/.cache/pixor/spill или PXR_SPILL_DIR — и считывается по мере надобности: те же пиксели, только медленнее, а папка удаляется вместе с завершением рендера.

Коды выхода

Код
0 успех
1 неудачный рендер, экспорт, пакетная модель, строка задания или эталонный случай
2 ошибка использования: сообщение, справка по команде и see pxr help COMMAND в stderr
3 вход, который не удалось прочитать: модель, проект, палитра, набор, файл случая или дамп
4 бэкенд, запрошенный по имени, которого нет
5 выход, который не удалось записать: файл или папка
6 превышение бюджета --max-pixels, --max-memory или --max-time
7 повторное запекание, сохранившее прорисовку, о которой оно не станет решать само (--resolve keep|pixor)

Отсутствие GPU — не ошибка: тогда Pixor рисует собственным растеризатором. Ошибка везде сообщает, что не так, одинаково: --flag takes A to B, got X.

Выбор рендерера

--backend auto|vulkan|metal|dx12|gl|webgpu|cpu задает, кто рисует геометрию. Облик — каждый пиксельный проход — рассчитывается на CPU, что бы здесь ни было указано.

  • auto (по умолчанию) берет то, что есть на компьютере, и переходит на CPU, если ни один адаптер не работает.
  • cpu — собственный растеризатор Pixor. Ему не нужны ни адаптер, ни драйвер, он встроен в исполняемый файл и рисует одни и те же пиксели на любом компьютере — переносимый выбор для пака ассетов или CI-сборки.
  • Бэкенд, который назван, но недоступен, — это ошибка (код выхода 4), потому что молча рендерить на чем-то другом хуже, чем сказать об этом.

Рецепт каждого экспорта фиксирует, какой бэкенд его нарисовал. pxr doctor выводит найденные адаптеры, тот, который выбрал бы Pixor, версии драйверов и то, рисует ли этот бэкенд то же изображение, что и эталон на CPU:

adapter  NVIDIA GeForce RTX 3070 Ti (Vulkan, DiscreteGpu) driver NVIDIA 610.57.04
backend  vulkan (NVIDIA GeForce RTX 3070 Ti (Vulkan, DiscreteGpu))
agrees   vulkan vs the CPU reference: coverage 0.00%, ids 0.00%, albedo 0.00% (allowed 1.00%); normals within 0.028 deg, depth within 9.5e-7

В приложении тот же выбор — Настройки › Рендерер › Рисовать спрайты на CPU, а на один сеанс — pixor --backend B с теми же именами, что у pxr (cpu, auto или GPU-бэкенд по имени), что оставляет настройку как есть. Каждый сохраняет то, что нарисовал: переключение на другой рендерит кадры заново, а возврат обратно возвращает кадры первого без рендера, если в сцене ничего не изменилось.

Для инструментов и скриптов

Добавьте --json к любой команде: тогда стандартный вывод несет по одному JSON-событию на строку (progress, wrote, warning, error, done), а читаемый журнал переходит в стандартный поток ошибок. Команды, которые читают, а не пишут, тоже выдают напечатанное одним событием: inspect, adapters, tiles --list (terrains), graph list и graph flatten, а также diff двух дампов.

То, что описано на этой странице, есть в полной версии; бесплатное демо в браузере ограничено обликом по умолчанию и PNG-листом.

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