Решили: тёмный край следа клинка получается крайней ступенью его собственного градиента, а не
контуром поверх; заодно ширина следа едет профилем-полумесяцем вдоль угла. SH_Vfx_SwingArc переехал
на premultiplied alpha, как днём раньше форма удара.
Почему: у дуги хвост гаснет по углу, поэтому контур снаружи обводит место, где свечения уже нет — хвост читается чёрной тряпкой. Ступень внутри градиента этой проблемы не имеет по построению: где нет света, там нет и кромки. Отвергнуты: контур полной силы (см. выше) и контур, гаснущий вместе с хвостом — второй выглядел прилично, но остаётся вторым слоем ради того, что делает один градиент.
Сказано: «Сделать градиент с началом и концом с черным (+ по краям)? Чтобы выглядло как этакий аутлайн и это ничего не нарушало» и «След не просто должен сотановиться менее по opasity незаметным, но менять и “ширина” следа на его окончании. (Как “параболе”? Хз как сказать, но чем ближе к концу, тем быстрее уменьшение)» (06.08.2026, сессия a4e2eebd).
Грабли:
- «Ничего не нарушает» — про язык, но не про блендинг. Чёрное — это перекрытие, а
Blend One Oneперекрывать не умеет ни при каком цвете. Дуге понадобилась та же правка, что форме удара; сила перекрытия вынесена ручкой_Opaque, и на нуле шейдер ведёт себя ровно как прежний аддитив. - Нормировка профиля считается СНАРУЖИ. Максимум
t^p (1 - 0.45 t³)берётся аналитически в C# (t³ = p / (0.45 (p + 3))) и приходит юниформом: искать его циклом в пикселе значило бы гонять сорок итераций на каждом фрагменте ради числа, которое меняется раз в жизни материала. Без нормировки «острее» означало бы заодно «тоньше». - Мягкость края мерится в долях ПОЛУТОЛЩИНЫ, а не в мировых единицах. След сужается к хвосту до
нуля, и постоянный
fwidth(r)там съедал бы всю полосу — хвост зазубривался. - Публичный
Enable*, который читает только сам конфиг, роняет тест.FeelToggleCoverageTestsтребует, чтобы тумблер спрашивали в коде презентации; ручка подачи применяется внутриCombatFeelConfigпри сборкеSwingArcStyle, поэтому публичного свойства у неё нет, а в переписи она помечена внутренней. Тест поймал это на первой же версии. - Стенд Лаборатории нельзя рисовать сегментами. Сорок сегментов сектора дали швы: светлые полосы на аддитивных стыках и тёмные щели без нахлёста. Заливка одним путём с коническим градиентом решает это по построению — в шейдере той же проблемы нет, там всё считается в пикселе.
Владелец правды: SH_Vfx_SwingArc.shader, SwingArcStyle в SwingArcVfx.cs (числа стиля и
нормировка профиля), CombatFeelConfig (ручки и тумблер), тест FeelToggleCoverageTests.
Дизайн-сторона — канон gdd/70-gamefeel/vfx-language §«След клинка — росчерк» и запись журнала ГД
2026-08-06.