Custom Vertex3 D
programmable vertex processor
CustomVertex3D программирует данные каждой вершины scene3d: Position, normals, vertex color, UVW, tangents и velocity; три optional image inputs, Numbers/Points/LUT и двухстадийные Setup/Intermediate превращают ноду в мини-язык процедурной геометрии.
Classic Fusion scene3d от ImagePlane3D, Shape3D, Merge3D, imported mesh или другого 3D processor.
CustomVertex3D
Обзор
Что делает CustomVertex3D
Resolve 21 описывает CustomVertex3D как advanced custom node для per-vertex манипуляций. Нода способна менять Position, normals, vertex color, texture coordinates, environment coordinates, UV tangents и velocity. Это не Transform3D: формула выполняется на vertex attributes, а не только на object transform.
У ноды четыре inputs. Orange SceneInput обязателен и принимает classic scene3d. Три optional image inputs — ImageInput1, ImageInput2 и ImageInput3 — принимают 2D images и доступны expression system для image lookup. Старое описание с одним зелёным Input было неверным.
Position по умолчанию использует px/py/pz. Важно: изменение vertex Position не пересчитывает normals/tangents. После волн, скручивания или сильного displacement shading может остаться от исходной поверхности; Blackmagic прямо рекомендует ReplaceNormals downstream, когда требуется новый basis.
Не вся geometry содержит все attributes. Resolve 21 отмечает: vertex color обычно отсутствует у обычной Fusion geometry, но встречается у particles и части импортированных FBX/Alembic meshes; envcoord сейчас обычно отсутствует; velocity характерна для particles. Для отсутствующих streams используются documented defaults.
Documented defaults: tangentU=(1,0,0), tangentV=(0,1,0), normal=(0,0,1), vertexColor=(1,1,1,1), velocity=(0,0,0), envcoord=(0,0,0), texcoord=(0,0,0). Если expression для отсутствующего attribute non-trivial, Fusion может создать соответствующий stream из этого default baseline.
Numbers 1–8 — анимируемые numeric variables n1…n8; current reference также документирует n#_at(t). Points 1–8 — управляющие 3D-точки p#x/p#y/p#z с time-sampled variants. Эти Points — controls самой ноды, не vertices source mesh.
LUTs 1–4 дают четыре lookup splines getlut1(x)…getlut4(x) для нелинейного remap. В тексте manual встречается legacy-строка про lut1…lut8, но сам Inspector и documented functions показывают именно четыре LUT. Для статьи считаем каноническими LUT 1–4 и не выдумываем LUT 5–8.
Setup и Intermediate имеют разный evaluation scope. Setup вычисляется один раз на кадр до vertex stage и подходит для global/time-dependent preparation. Intermediate вычисляется для каждой вершины после Setup и подходит для distance, masks и других per-vertex промежуточных значений. В Resolve 21 есть внутренняя нестыковка документации: заголовок говорит Setups 1–8, но строка с именами результатов перечисляет только s1…s4; Intermediate при этом явно перечисляет i1…i8. Поэтому s5…s8 не объявляем проверенными без live target-build теста.
Image inputs дают expression system доступ к пикселям. Fusion reference документирует get[ch][#]b/d/w lookup families в нормализованных image coordinates: (0.5, 0.5) — центр изображения. Суффикс b возвращает 0 за границей, d берёт edge pixel, w заворачивает координаты; номер 1/2/3 выбирает соответствующий image input. Поэтому getr1d(tu,tv) корректен только когда UV действительно лежат в ожидаемом 0…1 пространстве.
Expression math тоже имеет важную особенность: sin/cos/tan в Fusion Custom syntax принимают угол в градусах. Поэтому sin(90)=1, а привычная для многих языков радианная формула без пересчёта даст другой масштаб/скорость. Current Inspector capture также показывает Apply in Source Coordinates; точную семантику этого checkbox не выдаём за подтверждённую без live target-build A/B.
Output CustomVertex3D остаётся scene3d. Ни подключение ImageInput, ни изменение vertex color не превращают его в RGBA. Для MediaOut и обычных 2D effects обязателен Renderer3D.
Bundled screenshots подтверждают Vertex, Numbers, Points, LUTs, Setup, Inter и Config tabs. Содержательные semantics сверены с Resolve 21 reference; live execution Resolve 21/21.1 в этом пакете не выполнялся, поэтому current-build edge cases и Apply in Source Coordinates остаются pending.
Плотность mesh — часть алгоритма. CustomVertex3D двигает существующие vertices и не создаёт topology: одинаковая формула на плоскости 10×10 и 200×200 даёт совершенно разную геометрическую детализацию.
Для wave/displacement полезно сначала отладить формулу на wireframe или простом матовом шейдере. Красивый material может скрыть недостаток subdivisions, перевёрнутые normals или слишком резкий derivative.
Image lookup и material texture — разные роли. ImageInput1–3 доступны expression system как числовые sample sources; они не назначаются объекту как материал и не появляются в render сами по себе.
Функции getr/getg/getb/geta с индексом input читают пиксели в normalized image coordinates. Если source geometry не имеет пригодных UV, выражение на tu/tv может читать одну и ту же точку карты или default (0,0,0).
Boundary suffix важен для деформации у UV-краёв: b возвращает black/zero вне изображения, d удерживает edge pixel, w заворачивает координату. Это может радикально менять seam даже при одной и той же texture.
Numbers и Points полезно воспринимать как публичный API процедурного рига. Сложная математика остаётся внутри expressions, а художнику можно оставить только amplitude, frequency, center, radius и другие понятные controls.
Time-sampled variants n#_at(t) и point variants позволяют обращаться к значению control в другом времени. Это мощный инструмент temporal procedural logic, но он легко делает выражение дорогим и трудным для диагностики.
LUT 1–4 удобны как artist-friendly transfer functions: distance или sampled texture превращается в falloff, threshold-like response или easing без длинной цепочки if/min/max.
Setup следует держать независимым от конкретной вершины. Если формула требует px, py, pz, normals или UV текущего vertex, это признак, что расчёт относится к Intermediate/Vertex stage, а не к Setup.
Intermediate уменьшает дублирование тяжёлой per-vertex математики. Например radius можно посчитать один раз и использовать одновременно для Position, Vertex Color и нескольких других attributes.
При записи Vertex Color не предполагайте, что renderer/material автоматически использует этот stream. Нужно отдельно подтвердить downstream material/shader path, который действительно читает vertex color.
Environment coordinates в текущем classic Fusion geometry обычно отсутствуют. Наличие полей eu/ev/ew в expression language не доказывает наличие meaningful envcoord у конкретного source mesh.
Velocity stream в основном характерен для particles. Запись vx/vy/vz на обычной geometry может создать attribute stream, но downstream usefulness зависит от конкретного tool, который этот stream читает.
Tangent U/V имеют смысл только вместе с согласованными UV/normals и material workflow. Произвольная ручная правка tangents может сломать normal/bump shading даже при визуально правильной геометрии.
Random Seed и Reseed полезны только когда expression действительно использует random/noise mechanism, зависящий от seed. Нажатие Reseed не обязано менять deterministic expression без random component.
Config controls управляют тем, какие Numbers/Points/Images/LUTs выставлены наружу и как они подписаны. Это packaging слоя управления, а не ещё один vertex-processing pass.
Для production-шаблона полезно сначала собрать формулу с техническими именами n1/p1/getlut1, затем в Config переименовать только реально используемые public controls и скрыть остальные.
CustomVertex3D может быть вычислительно тяжёлым на dense geometry, потому что Intermediate и Vertex expressions выполняются на каждую вершину. Стоимость растёт с числом vertices, сложностью формул и количеством image lookups.
Перед оптимизацией измеряйте bottleneck: уменьшение mesh density, перенос frame-global math в Setup и повторное использование Intermediate обычно полезнее, чем механическое сокращение текста expression.
Финальная проверка должна проходить не только во Viewer 3D, но и через Renderer3D с реальным светом/material. Ошибки normals, tangents и attribute streams часто проявляются только после shading.
Когда применять
Процедурные волны и деформации dense mesh
Image-driven vertex displacement через ImageInput1–3
Собственные falloff по Points + LUT
Procedural UV remap и texture-coordinate animation
Техническая запись/модификация normals, tangents или vertex color
Эксперименты с атрибутами частиц и скорости
Сборка reusable artist controls через Numbers/Points/Config
CustomVertex3D в контексте
Скриншоты из статьи. Откройте изображение, чтобы рассмотреть его крупнее.
Пример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображениеПример для CustomVertex3D.
Оригинальное изображение