[[Почему если в 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 объявлением.