![[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`) для новой пачки.