# Render target — `$.viewport`

Привязанная текстура имеет приоритет над пост-обработкой: кадр уходит в неё, а
на экран попадает отдельным блитом, при этом HUD рисуется поверх. Так делают
мини-карту, портал и превью.

```js
const map = $.viewport.create(200, 150);
$.ready(() => {
    $.viewport.bind(map);                       // каждый кадр заново
    drawMiniMap();                              // сцена мини-карты
    $.viewport.unbind();
    $.gfx.draw.sprite($.viewport.sprite(map), 10, 10, 200, 150);
});
```

---

## 1. Методы

| Вызов | Смысл |
|---|---|
| `supported()` | поддержан ли render target в сборке |
| `create(w, h)` / `destroy(id)` | создать и удалить текстуру |
| `get(id)` / `size(id)` / `count()` | описание, размер, сколько создано |
| `bind(id)` / `unbind()` / `bound()` | привязка на кадр и что привязано |
| `sprite(id)` | спрайт **прошлого** кадра текстуры |
| `draw(id, x, y, w, h, opts)` | нарисовать прошлый кадр как спрайт |

Привязка живёт **один кадр**: `bind` нужно звать каждый кадр заново, как в
примере выше.

## 2. Режимы смешивания

`$.blend(name)` задаёт режим по умолчанию для кадра; у узла — `.blend(name)`.
Режимы: `alpha`, `add`, `multiply`, `none`. Порядок и имена — `BLEND_MODES`
(экспортируется из модуля), чистые помощники `normalizeBlend`,
`resolveBlend`, `blendRuns` используются батчером, чтобы резать список команд
на непрерывные участки.

## 3. Ограничения

* **камера и HUD в текстуру не попадают** особым образом: в текстуру уходит
  сцена, HUD рисуется поверх обычным путём;
* **пост-обработка при привязанной текстуре отключается**: её считали бы по
  чужой текстуре;
* **глубина и Stencil** в render target не заводятся: цель глубины только у
  кадра экрана (см. [depth.md](highlevel/depth));
* **нельзя читать пиксели обратно**: `sprite()` отдаёт прошлый кадр как спрайт,
  выгрузить пиксели в JS нельзя;
* **размер ограничен**: движок не даёт создавать текстуры больше 16384 по
  стороне и держит общий лимит текстур (256).

## 4. Связанное

* [render.md](highlevel/render) §3 — как устроен путь отрисовки;
* [depth.md](highlevel/depth) — z-буфер кадра;
* [fx.md](highlevel/fx) — пост-обработка (при привязанной текстуре не применяется).
