> For the complete documentation index, see [llms.txt](https://docs.nursultan.fun/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nursultan.fun/scripting-api-ru/interfeis/sheidery.md).

# Шейдеры

Шейдер — это маленькая программа, которая считает цвет каждого пикселя. Пригодится, когда фигурами и картинками нужного эффекта не собрать: волны, свечение, шум, градиенты по формуле.

## Скомпилировать

Пишется один раз на верхнем уровне скрипта:

```kotlin
val glow = shader("glow", """
    #version 150

    uniform vec2 uSize;
    uniform float uTime;

    in vec2 texCoord;
    out vec4 fragColor;

    void main() {
        vec2 uv = gl_FragCoord.xy / uSize;
        float pulse = 0.5 + 0.5 * sin(uTime * 2.0);
        fragColor = vec4(0.35, 0.78, 1.0, pulse * 0.6);
    }
""")
```

Первый аргумент — имя, по нему шейдер видно в логах. Второй — исходник фрагментного шейдера на GLSL.

## Проверить, что собрался

Компиляция может не удаться — тогда лучше это заметить сразу:

```kotlin
if (!glow.ready()) {
    log.error("шейдер не собрался: " + glow.error())
}
```

## Нарисовать

```kotlin
on<Render2DEvent> { e ->
    glow.set("uSize", e.width(), e.height())
    glow.set("uTime", client.millis() / 1000f)
    e.render().shader(glow, 8f, 8f, 160f, 40f)
}
```

`shader(...)` рисует прямоугольник, залитый твоим шейдером.

## Передать значения

```kotlin
glow.set("uAlpha", 0.5f)
glow.set("uSize", width, height)
glow.set("uColor", 0.35f, 0.78f, 1.0f)
glow.set("uRect", x, y, w, h)
glow.set("uSteps", 8)
```

Имя должно совпадать с именем `uniform` в исходнике. Значения устанавливаются перед отрисовкой, в том же кадре.

## Что учесть

* Шейдер компилируется один раз при загрузке скрипта, а не в кадре — не вызывай `shader(...)` внутри обработчика отрисовки.
* Работает только с фрагментным шейдером; вершинный берётся стандартный.
* Ошибка компиляции не роняет ни клиент, ни скрипт — просто ничего не нарисуется, а причина будет в `error()`.
* Всё, что нарисовано шейдером, видно только тебе.

## Когда шейдер не нужен

Размытие подложки уже есть готовое — `render.blur(...)`, писать под это шейдер не надо. Двухцветный градиент — `render.gradient(...)`. Шейдер имеет смысл, когда эффект действительно считается по пикселям.
