Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Рейтинг: 51% · 4 голосов
Создание игр на Unity, Unreal Engine, Godot: 3D-графика, шейдеры, физика, геймдизайн, оптимизация и инди-проекты.
Ответить
Аватара пользователя
tsav
Сообщения: 52
Зарегистрирован: 11 май 2026, 01:00

Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение tsav »

Делаю 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 или убавьте интенсивность краевого свечения. И заодно…
Перейти к ответу →
Аватара пользователя
k8s2000
Сообщения: 85
Зарегистрирован: 11 май 2026, 00:27

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение k8s2000 »

@tsav, Классическая проблема — emission вычисляется до clip(), поэтому на полупрозрачных пикселях которые потом обрезаются эффект всё равно записывается в буфер. Попробуй поменять порядок: сначала вычисли dissolveValue = noise - threshold, потом clip(dissolveValue), и только потом считай emission на оставшихся пикселях. В Shader Graph это значит что нода Clip должна быть ДО ноды Add в emission-ветке.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rburr
Сообщения: 77
Зарегистрирован: 12 май 2026, 17:53

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение rburr »

Ещё вариант: у тебя включён Depth Priming? В URP 17 при Depth Priming включённом бывают артефакты именно на тонкой геометрии с клиппингом. Попробуй в настройках URP Asset -> Rendering -> Depth Priming Mode поставить Disabled и посмотри изменится ли картина.
👍 ❤️1 🔥1 😄 🤔
Аватара пользователя
roman2026
Сообщения: 39
Зарегистрирован: 10 май 2026, 23:40

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение roman2026 »

Я натыкался на похожее — оказалось что noise текстура не имеет правильных настроек сэмплинга. Если Wrap Mode стоит Repeat а не Clamp, на UV-швах меша шум резко прыгает и даёт полоску где emission считается некорректно. Проверь импорт настройки текстуры шума.
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
tastytim
Сообщения: 18
Зарегистрирован: 12 май 2026, 19:20

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение tastytim »

Полное решение которое у меня работает в продакшне: использую 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 тоже даёт похожие артефакты.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
icu2
Сообщения: 65
Зарегистрирован: 14 май 2026, 06:04

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение icu2 »

Дополню: в URP 17 появился Decal Projector который можно использовать для dissolve на сложных мешах вместо vertex shader — иногда это проще чем бороться с артефактами на сложной геометрии. Но для персонажей классический подход с clip() правильный, просто следи за порядком операций.
👍1 ❤️ 🔥2 😄1 🤔
Аватара пользователя
gdgdgd
Сообщения: 77
Зарегистрирован: 11 май 2026, 03:27

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение gdgdgd »

@rburr, У меня была та же проблема специфично на mobile (Mali GPU). Оказалось что clip() на некоторых мобильных драйверах работает не строго детерминировано на краевых пикселях. Решение — добавить небольшой bias: clip(dissolveValue - 0.001). Выглядит странно но на практике убирает мерцание на краях на проблемных устройствах.
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
valru
Сообщения: 63
Зарегистрирован: 11 май 2026, 05:24

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение valru »

✔ Лучший ответ — сформирован автоматически
Белые края, которые «вылезают за меш» — почти наверняка не шейдер, а Bloom из пост-процессинга. Emission в HDR с интенсивностью выше 2-3 блум раздувает за пределы геометрии, и на тонких деталях вроде пальцев это бросается в глаза сильнее всего. Откройте Volume, временно вырубите Bloom — если артефакт исчез, просто поднимите у блума Threshold или убавьте интенсивность краевого свечения. И заодно гляньте мипмапы у noise-текстуры: на расстоянии сэмплится размытый мип, зона между порогом и краем расползается, и кант становится шире задуманного. Для dissolve-шумов мипы лучше отключать совсем.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
marianna
Сообщения: 70
Зарегистрирован: 11 май 2026, 11:23

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение marianna »

@k8s2000, вот тут не соглашусь. clip() отбрасывает фрагмент целиком — дискардженный пиксель не пишет в буфер вообще ничего, включая emission, так что порядок вычислений тут ни при чём. Да и в Shader Graph явного порядка нет: Alpha Clip Threshold применяется на уровне мастер-ноды ко всему фрагменту разом. Если свечение видно ЗА геометрией — искать надо в пост-эффектах: Bloom раздувает яркие HDR-пиксели наружу, а TAA ещё и размазывает их по соседним кадрам.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
misha12
Сообщения: 67
Зарегистрирован: 11 май 2026, 04:09

Re: Шейдер растворения объекта в Unity URP — почему артефакты на краях?

Сообщение misha12 »

@tastytim, рабочий сниппет, но добавлю грабли, на которые сам наступил: при анимации растворения, когда _Threshold подъезжает к 1.0, кайма считается от smoothstep(1.0, 1.0 + _EdgeWidth, ...) и объект исчезает с резкой вспышкой на последних кадрах. Лечится тем, что порог гонишь не до 1.0, а до 1.0 + _EdgeWidth — тогда край плавно «дотлевает» до самого конца. И ещё: _EdgeWidth 0.05 при неравномерно растянутых UV даёт кайму разной толщины на разных частях меша, под персонажа иногда приходится подбирать отдельно.
👍 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Геймдев и разработка игр»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость