![[Pasted image 20250527144130.png]]
### Что происходит на схеме у SRP Batcher
> Тут НЕ разбирается Standard SRP.
1. **SetShaderPass — «тяжёлый» GPU-настрой**
- ▸ Unity вызывает `SetPass` (в SRP — `SetShaderPass`) только когда переходит на **другой шейдер-вариант** (shader variant) или другой `Pass`.
- ▸ Вызов подготавливает _весь_ GPU-state: устанавливаются программы вершинного/фрагментного шейдера, описания ресурсов, семантики входов и т. д.
- ⚡ Это дорогая (CPU-bound) операция; именно её мы хотим вызывать как можно реже.
2. **Начинается SRP-Batch**
- SRP Batcher группирует все объекты, которые рендерятся **одним и тем же шейдер-вариантом**, в единую «пачку» (batch).
- Пока сохраняется тот же вариант, `SetShaderPass` больше не вызывается — экономим CPU.
3. **Bind persistent Material CBUFFER**
- ▸ Создаётся и привязывается _единственный_ **постоянный** (`persistent`) `CBUFFER` (constant buffer) c данными материала (материал = параметры, не меняющиеся от объекта к объекту).
- Этот буфер остаётся привязанным на протяжении **всей** пачки.
4. **Bind with offset Object-data from a large CBUFFER**
- Для каждого объекта Unity не создаёт новый буфер, а **смещается** (`offset`) внутри большого, заранее выделенного `CBUFFER`, где лежат структуры с пер-объектными данными (матрица Model, цвета, mask-и и т. д.).
- Переключение смещения – дешёвое: одна команда `SetRootConstant`/`BindConstantBufferRange` вместо полного rebnding.
5. **Draw Call**
- Вызывается сам `DrawIndexed/DrawIndexedInstanced` — GPU получает вершинные/индексные данные, пользуясь уже привязанными буферами.
6. **Проверка «Shader Variant break?»**
- ▸ После draw Unity сравнивает следующий объект в очереди:
- **NO** → вариант тот же → цикл возвращается к шагу 4 (меняем только offset).
- **YES** → вариант сменился → выход из пачки → снова шаг 1 (`SetShaderPass`) для новой пачки.