ВИДЕОМОНТАЖЁРDAVINCI RESOLVE · ВИДЕО · AI
ОбработкаFUSION

CustomVertex3D

programmable vertex processor

CustomVertex3D программирует данные каждой вершины scene3d: Position, normals, vertex color, UVW, tangents и velocity; три optional image inputs, Numbers/Points/LUT и двухстадийные Setup/Intermediate превращают ноду в мини-язык процедурной геометрии.

Нода в работе
Иллюстрация нодыCustomVertex3D
РезультатСцена 3D

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