[[Почему если в Shader Graph у свойства выключить Exposed и включить Override Property Declaration, то шейдер не будет совместим с SRP Batcher?|Назад]] ![[Снимок экрана 2025-05-27 в 12.33.03.png]] ##### Как я исправил эту ошибку - Поставил галку напротив `Exposed` (она была снята) - Снял галку напротив `Override Property Declaration` (Она была поставлена). Исправлял шейдер в VAT-библиотеке. В итоге получилось так: ![[Снимок экрана 2025-05-27 в 13.18.58.png|300]] # Ответ от ChatGPT-o3: Это та же «семья» ошибок, что и [[Почему если в Shader Graph у свойства выключить Exposed и включить Override Property Declaration, то шейдер не будет совместим с SRP Batcher?|здесь]]: нарушена форма записи, которую проверяет SRP Batcher. Конкретно данное сообщение значит, что переменная **_PreviousClipDuration** уже лежит в `CBUFFER_START(UnityPerMaterial)…CBUFFER_END`, но **не описана** в разделе _Properties_ (то есть в чёрном списке Shader Graph/ShaderLab). Именно такого несоответствия SRP Batcher и не допускает. ([blog.csdn.net](https://blog.csdn.net/u010133610/article/details/120748040 "Unity URP SRPBatcher踩坑记录_unitypermaterial cbuffer inconsistent size inside -CSDN博客")) ##### Почему чаще всего появляется это предупреждение 1. **Override Property Declaration ✓** При включении этой опции Shader Graph выводит саму переменную в код, но перестаёт генерировать для неё запись в _Properties_. В итоге: - в `UnityPerMaterial` запись есть; - в блоке _Properties_ — нет; → батчер сигналит указанной фразой. 2. Ручное редактирование/копипаст кода или include-файлов, где вы добавили строку в `UnityPerMaterial`, но забыли аналогичную строку в ShaderLab-разделе _Properties_. 3. Автоматические генераторы (например, Amplify/ShaderGraph Custom Function), которые добавляют переменную через `#pragma multi_compile`, но не кладут её в _Properties_. Требование батчера выглядит так: _«Все material-параметры должны одновременно_   • быть объявлены в одном CBUFFER `UnityPerMaterial`,   • и присутствовать в Shader-property-секции»*. ([docs.unity3d.com](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal%4015.0/manual/writing-shaders-urp-unlit-color.html "URP unlit shader with color input | Universal RP | 15.0.7")) ##### Как исправить - **Самый простой путь** — снять галочку **Override Property Declaration** или сменить режим на _Per-Material_; при этом Shader Graph снова добавит строку в _Properties_. - Если нужно спрятать поле из инспектора, оставьте Override выключенным и просто уберите галочку **Exposed** — в коде всё останется корректно, а в Material поле исчезнет. - Для вручную написанных шейдеров добавьте недостающую строку в блок _Properties_, например: ```hlsl Properties { _PreviousClipDuration ("Prev Clip Dur", Float) = 0 } ``` - Проверьте, что у всех Pass-ов шейдера (`SubShader`/`Pass`) одинаковый состав CBUFFER-а; иначе появится следующее предупреждение — _“UnityPerMaterial CBuffer inconsistent size…”_. ##### Производительность После устранения несоответствия SRP Batcher снова будет группировать draw-calls этого шейдера, экономя до ~40 µs CPU на каждые 1 000 вызовов `DrawRenderers` на мобильных/VR-чипах (измерения Unity). Если же нужны именно глобальные (`uniform`) переменные, придётся выбирать между удобством и этими CPU-выигрышами; типично глобальное обновление параметров «всем материалам» всё-таки быстрее и проще реализовать через `MaterialPropertyBlock` с Per-Material объявлением.