Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Рейтинг: 51% · 4 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- yaroslav_hex13
- Сообщения: 20
- Зарегистрирован: Пн май 11, 2026 8:32 am
Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Делаю dissolve-эффект через Shader Graph в Unity 6 URP. Логика стандартная: сэмплирую noise текстуру, сравниваю с threshold, делаю clip(). Добавил emission на краях через step() от разницы между шумом и порогом. Всё работает в сцене, но на краях объекта появляются белые артефакты — как будто emission «вылезает» за пределы меша, особенно заметно на тонких деталях (пальцы персонажа, края листьев). Версия Unity 6.0.35, URP 17. Что за хрень и как починить?
✔ Лучший ответ сформирован автоматически — sasha_py52
Полное решение которое у меня работает в продакшне: использую 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 даёт мягкий светящийся…
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@senior_burnout, Классическая проблема — emission вычисляется до clip(), поэтому на полупрозрачных пикселях которые потом обрезаются эффект всё равно записывается в буфер. Попробуй поменять порядок: сначала вычисли dissolveValue = noise - threshold, потом clip(dissolveValue), и только потом считай emission на оставшихся пикселях. В Shader Graph это значит что нода Clip должна быть ДО ноды Add в emission-ветке.
- natalia_tech
- Сообщения: 2
- Зарегистрирован: Вс май 17, 2026 5:04 pm
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Ещё вариант: у тебя включён Depth Priming? В URP 17 при Depth Priming включённом бывают артефакты именно на тонкой геометрии с клиппингом. Попробуй в настройках URP Asset -> Rendering -> Depth Priming Mode поставить Disabled и посмотри изменится ли картина.
- flowgo4491
- Сообщения: 12
- Зарегистрирован: Вс май 10, 2026 8:32 pm
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Я натыкался на похожее — оказалось что noise текстура не имеет правильных настроек сэмплинга. Если Wrap Mode стоит Repeat а не Clamp, на UV-швах меша шум резко прыгает и даёт полоску где emission считается некорректно. Проверь импорт настройки текстуры шума.
- sasha_py52
- Сообщения: 10
- Зарегистрирован: Пн май 11, 2026 6:50 pm
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 тоже даёт похожие артефакты.
- valera_nova83
- Сообщения: 6
- Зарегистрирован: Ср май 13, 2026 5:48 am
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
Дополню: в URP 17 появился Decal Projector который можно использовать для dissolve на сложных мешах вместо vertex shader — иногда это проще чем бороться с артефактами на сложной геометрии. Но для персонажей классический подход с clip() правильный, просто следи за порядком операций.
- tanya_pixel80
- Сообщения: 5
- Зарегистрирован: Вс май 10, 2026 9:57 pm
Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?
@kirill_backend, У меня была та же проблема специфично на mobile (Mali GPU). Оказалось что clip() на некоторых мобильных драйверах работает не строго детерминировано на краевых пикселях. Решение — добавить небольшой bias: clip(dissolveValue - 0.001). Выглядит странно но на практике убирает мерцание на краях на проблемных устройствах.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость