📅 Березень 2026⏱ Швидкий довідник🎯 GLSL ES 3.0 (WebGL 2)
Швидкий довідник вбудованих функцій GLSL
Усі вбудовані функції GLSL ES 3.0, згруповані за категоріями —
математичні, геометричні, текстурні, похідні, матричні та конструктори
типів — із сигнатурами, нотатками щодо поведінки й специфічними для
WebGL підводними каменями. Додайте до закладок, коли пишете шейдери.
1. Нотація типів і genType
Сигнатури вбудованих функцій GLSL використовують узагальнені назви
типів. Функція, для якої вказано приймання genType,
насправді має перевантаження для всіх перелічених нижче типів:
Псевдонім
Розгортається в
genType
float, vec2, vec3, vec4
genIType
int, ivec2, ivec3, ivec4
genUType
uint, uvec2, uvec3, uvec4
genBType
bool, bvec2, bvec3, bvec4
mat
mat2, mat3, mat4, mat2x3, mat2x4…
gsampler2D
sampler2D, isampler2D, usampler2D
Коли функція приймає genType x, genType y, обидва
аргументи мають мати однаковий тип і розмірність — не можна змішувати
vec3 і float без явного приведення типу.
GLSL ES 3.0 проти 1.0: WebGL 1 використовує GLSL ES
1.00 (без цілих чисел, без textureSize, без dFdx у деяких реалізаціях).
WebGL 2 використовує GLSL ES 3.00 — потребує #version 300 es
на початку шейдера. Усі функції в цьому довіднику належать до GLSL ES
3.0, якщо не позначено інакше 1.0.
2. Функції кутів і тригонометрії
Усі тригонометричні функції працюють із радіанами. Вхід/вихід —
genType.
Функція
Опис
Нотатки
radians(d)
градуси → радіани
= d · π/180
degrees(r)
радіани → градуси
= r · 180/π
sin(x)
Синус
Діапазон [−1, 1]
cos(x)
Косинус
Діапазон [−1, 1]
tan(x)
Тангенс
Невизначений при π/2 + kπ
asin(x)
Арксинус
Невизначена поведінка, якщо |x| > 1; повертає [−π/2, π/2]
acos(x)
Арккосинус
Невизначена поведінка, якщо |x| > 1; повертає [0, π]
atan(y, x)
atan2 — арктангенс повного діапазону
Повертає [−π, π]; кращий за atan(y/x)
atan(y_over_x)
Арктангенс з одним аргументом
Повертає [−π/2, π/2]; на межі ±π використовуйте форму з двома аргументами
sinh(x)
Гіперболічний синус
(eˣ − e⁻ˣ)/2
cosh(x)
Гіперболічний косинус
(eˣ + e⁻ˣ)/2; завжди ≥ 1
tanh(x)
Гіперболічний тангенс
Діапазон (−1, 1)
asinh(x)
Обернений гіперболічний синус
Визначений для всіх x
acosh(x)
Обернений гіперболічний косинус
Невизначена поведінка, якщо x < 1
atanh(x)
Обернений гіперболічний тангенс
Невизначена поведінка, якщо |x| ≥ 1
Прийом згортання sin/cos: Якщо ви накопичуєте часову
змінну й передаєте її в sin/cos, то щойно float перевищить ~10⁵, період
почне дрейфувати на mediump. Використовуйте:
float t = mod(uTime, 6.2831853);, щоб зберегти точність.
3. Експоненційні та логарифмічні функції
Функція
Опис
Нотатки
pow(x, y)
x^y
Невизначена поведінка, якщо x < 0; якщо x=0 і y≤0 — теж.
Якщо y динамічне, кращий
exp(y*log(x)).
exp(x)
eˣ
Переповнюється до +∞ для великих x; для основи 2 використовуйте exp2
log(x)
ln(x)
Невизначена поведінка, якщо x ≤ 0
exp2(x)
2ˣ
Апаратно прискорена на більшості GPU
log2(x)
log₂(x)
Невизначена поведінка, якщо x ≤ 0. Швидша за log на багатьох GPU.
sqrt(x)
√x
Невизначена поведінка, якщо x < 0. Для векторів — покомпонентно.
inversesqrt(x)
1/√x
Невизначена поведінка, якщо x ≤ 0. Використовуйте замість 1.0/sqrt(x) — одна
інструкція GPU.
4. Загальні математичні функції
Функція
Опис
Нотатки
abs(x)
|x| покомпонентно
Працює для векторів int, uint, float
sign(x)
−1, 0 або +1 на компонент
sign(0.0) = 0.0
floor(x)
Найбільше ціле ≤ x (як float)
floor(−0.5) = −1.0
ceil(x)
Найменше ціле ≥ x
ceil(−0.5) = 0.0
trunc(x)
Округлення до нуля
Лише ES 3.0. trunc(−0.9) = 0.0
round(x)
Округлення до найближчого; межові → парне
Лише ES 3.0. «Банківське округлення»
roundEven(x)
Округлення половини до парного (IEEE)
Лише ES 3.0
fract(x)
x − floor(x)
Завжди в [0, 1). fract(−0.3) = 0.7
mod(x, y)
x − y·floor(x/y)
Знак результату збігається зі знаком y (не x). Для від’ємного x: mod(−1.0, 4.0) =
3.0
modf(x, out i)
Повертає fract(x); i = trunc(x)
i — вихідний параметр
min(x, y)
Покомпонентний мінімум
y може бути скаляром (поширюється)
max(x, y)
Покомпонентний максимум
y може бути скаляром
clamp(x, lo, hi)
max(lo, min(hi, x))
Невизначена поведінка, якщо lo > hi
mix(x, y, a)
Лінійна інтерполяція: x·(1−a) + y·a
a може бути bool-вектором: mix(x,y,bvec) вибирає компоненти
step(edge, x)
0, якщо x < edge; інакше 1
edge може бути скаляром або того ж типу, що й x
smoothstep(e0,e1,x)
Інтерполяція Ерміта 0→1
Невизначена поведінка, якщо e0 ≥ e1. = t²(3−2t), де t=clamp((x−e0)/(e1−e0),0,1)
isnan(x)
true, якщо x — NaN
Лише ES 3.0. Повертає bvec/bool
isinf(x)
true, якщо x — ±нескінченність
Лише ES 3.0
floatBitsToInt(v)
Переінтерпретація бітів як int
Лише ES 3.0. Без перетворення — прямий доступ до бітів
intBitsToFloat(v)
Переінтерпретація бітів int як float
Лише ES 3.0
packSnorm2x16(v)
Пакування vec2 в uint
Лише ES 3.0
unpackSnorm2x16(p)
Розпакування uint у vec2
Лише ES 3.0
// Поширений сніпет: плавний хеш-шум
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
}
// Безпечне застосування smoothstep
float ss = smoothstep(0.2, 0.8, uv.x); // завжди e0 < e1
// Вибір між двома значеннями за допомогою step (без розгалуження):
vec3 col = mix(colorA, colorB, step(0.5, uv.x));
5. Геометричні функції
Функція
Сигнатура
Опис
length(x)
float length(genType x)
Евклідова довжина √(x²+y²+…). Для vec3: √(x²+y²+z²)
distance(p0,p1)
float distance(genType p0, genType p1)
= length(p0 − p1). Використовуйте для перевірки близькості.
1.0 Еквівалент texture() у
фрагментних шейдерах ES 1.00. Недоступна в ES 3.00.
// Текстура даних (стан симуляції з ping-pong):
uniform sampler2D uState;
uniform vec2 uRes;
vec4 readCell(ivec2 coord) {
coord = clamp(coord, ivec2(0), ivec2(uRes) - 1);
return texelFetch(uState, coord, 0); // точний цілочисловий тексель, без фільтрації
}
// Сума сусідів (Conway / реакція-дифузія):
ivec2 px = ivec2(gl_FragCoord.xy);
vec4 c = readCell(px);
vec4 L = readCell(px + ivec2(-1, 0));
vec4 R = readCell(px + ivec2( 1, 0));
vec4 U = readCell(px + ivec2( 0, 1));
vec4 D = readCell(px + ivec2( 0,-1));
8. Функції похідних фрагмента
Функції похідних фрагмента доступні лише у фрагментному шейдері. Вони
обчислюють швидкість зміни значення між сусідніми квадами фрагментів.
Функція
Опис
dFdx(p)
Часткова похідна p за віконним x (стовпець екранного простору).
лише frag
dFdy(p)
Часткова похідна за y (рядок екранного простору). Умовність знака:
y+ спрямований угору в GLSL.
лише frag
fwidth(p)
= abs(dFdx(p)) + abs(dFdy(p)). Наближено оцінює «слід одного
пікселя» в будь-якій позиції.
лише frag
dFdxFine(p)
Лише ES 3.2. Дрібнозерниста похідна по кваду 2×1 (широко не
підтримується у WebGL). лише frag
dFdxCoarse(p)
Лише ES 3.2. Похідна по кваду 2×2 (дешевша, менш точна).
лише frag
Згладжені фігури за допомогою fwidth
// Згладжене коло (без потреби в MSAA):
float circle(vec2 uv, float r) {
float d = length(uv) - r;
float w = fwidth(d); // 1 піксель в одиницях відстані
return 1.0 - smoothstep(-w, w, d);
}
// Згладжені лінії сітки:
float grid(vec2 uv, float spacing) {
vec2 g = abs(fract(uv / spacing - 0.5) - 0.5);
vec2 w = fwidth(uv / spacing);
vec2 line = smoothstep(vec2(0.0), w * 1.5, g);
return 1.0 - min(line.x, line.y);
}
Нагадування про кваліфікатор точності:
У фрагментних шейдерах WebGL типова точність float
не визначена — її треба оголосити:
precision highp float; на початку кожного фрагментного
шейдера. mediump має лише ~13 бітів мантиси —
приблизно 3 десяткові цифри. Використовуйте highp для
позицій, UV та будь-яких обчислень, де потрібно >3 значущих
цифр.
Перевірка доступності: У WebGL 1 (GLSL ES 1.00)
функції похідних потребують розширення
OES_standard_derivatives: викличте
gl.getExtension('OES_standard_derivatives') і додайте
#extension GL_OES_standard_derivatives : enable на початку
шейдера. У WebGL 2 / GLSL ES 3.00 вони доступні завжди.