Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Рейтинг: 51% · 4 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Делаю dissolve-эффект через Shader Graph в Unity 6 URP. Логика стандартная: сэмплирую noise текстуру, сравниваю с threshold, делаю clip(). Добавил emission на краях через step() от разницы между шумом и порогом. Всё работает в сцене, но на краях объекта появляются белые артефакты — как будто emission «вылезает» за пределы меша, особенно заметно на тонких деталях (пальцы персонажа, края листьев). Версия Unity 6.0.35, URP 17. Что за хрень и как починить?
✔ Лучший ответ сформирован автоматически — valru
Белые края, которые «вылезают за меш» — почти наверняка не шейдер, а Bloom из пост-процессинга. Emission в HDR с интенсивностью выше 2-3 блум раздувает за пределы геометрии, и на тонких деталях вроде пальцев это бросается в глаза сильнее всего. Откройте Volume, временно вырубите Bloom — если артефакт исчез, просто поднимите у блума Threshold или убавьте интенсивность краевого свечения. И заодно…
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@tsav, Классическая проблема — emission вычисляется до clip(), поэтому на полупрозрачных пикселях которые потом обрезаются эффект всё равно записывается в буфер. Попробуй поменять порядок: сначала вычисли dissolveValue = noise - threshold, потом clip(dissolveValue), и только потом считай emission на оставшихся пикселях. В Shader Graph это значит что нода Clip должна быть ДО ноды Add в emission-ветке.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Ещё вариант: у тебя включён Depth Priming? В URP 17 при Depth Priming включённом бывают артефакты именно на тонкой геометрии с клиппингом. Попробуй в настройках URP Asset -> Rendering -> Depth Priming Mode поставить Disabled и посмотри изменится ли картина.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Я натыкался на похожее — оказалось что noise текстура не имеет правильных настроек сэмплинга. Если Wrap Mode стоит Repeat а не Clamp, на UV-швах меша шум резко прыгает и даёт полоску где emission считается некорректно. Проверь импорт настройки текстуры шума.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Полное решение которое у меня работает в продакшне: использую smoothstep вместо step для edge emission — это убирает резкий край. Код примерно такой: float dissolve = tex2D(_NoiseTex, i.uv).r; clip(dissolve - _Threshold); float edge = smoothstep(_Threshold, _Threshold + _EdgeWidth, dissolve); emission += edge * _EdgeColor * _EdgeIntensity; Параметр _EdgeWidth около 0.05-0.1 даёт мягкий светящийся край без артефактов. Плюс убедись что у материала Render Face стоит Both если объект тонкий — backface culling тоже даёт похожие артефакты.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Дополню: в URP 17 появился Decal Projector который можно использовать для dissolve на сложных мешах вместо vertex shader — иногда это проще чем бороться с артефактами на сложной геометрии. Но для персонажей классический подход с clip() правильный, просто следи за порядком операций.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@rburr, У меня была та же проблема специфично на mobile (Mali GPU). Оказалось что clip() на некоторых мобильных драйверах работает не строго детерминировано на краевых пикселях. Решение — добавить небольшой bias: clip(dissolveValue - 0.001). Выглядит странно но на практике убирает мерцание на краях на проблемных устройствах.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
✔ Лучший ответ — сформирован автоматически
Белые края, которые «вылезают за меш» — почти наверняка не шейдер, а Bloom из пост-процессинга. Emission в HDR с интенсивностью выше 2-3 блум раздувает за пределы геометрии, и на тонких деталях вроде пальцев это бросается в глаза сильнее всего. Откройте Volume, временно вырубите Bloom — если артефакт исчез, просто поднимите у блума Threshold или убавьте интенсивность краевого свечения. И заодно гляньте мипмапы у noise-текстуры: на расстоянии сэмплится размытый мип, зона между порогом и краем расползается, и кант становится шире задуманного. Для dissolve-шумов мипы лучше отключать совсем.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@k8s2000, вот тут не соглашусь. clip() отбрасывает фрагмент целиком — дискардженный пиксель не пишет в буфер вообще ничего, включая emission, так что порядок вычислений тут ни при чём. Да и в Shader Graph явного порядка нет: Alpha Clip Threshold применяется на уровне мастер-ноды ко всему фрагменту разом. Если свечение видно ЗА геометрией — искать надо в пост-эффектах: Bloom раздувает яркие HDR-пиксели наружу, а TAA ещё и размазывает их по соседним кадрам.
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@tastytim, рабочий сниппет, но добавлю грабли, на которые сам наступил: при анимации растворения, когда _Threshold подъезжает к 1.0, кайма считается от smoothstep(1.0, 1.0 + _EdgeWidth, ...) и объект исчезает с резкой вспышкой на последних кадрах. Лечится тем, что порог гонишь не до 1.0, а до 1.0 + _EdgeWidth — тогда край плавно «дотлевает» до самого конца. И ещё: _EdgeWidth 0.05 при неравномерно растянутых UV даёт кайму разной толщины на разных частях меша, под персонажа иногда приходится подбирать отдельно.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
- Купил 3080 с авито за 28к, через три недели артефакты. Рассказываю где лоханулся
7 ответов · 75 просмотров
-
- Купил 4070 Super с авито за 42к, через неделю артефакты. Учитесь на моих ошибках
6 ответов · 69 просмотров
-
-
- Купил 3080 на авито за 33к, две недели полет нормальный, потом артефакты. Разбор моего фейла
7 ответов · 54 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость