💡 Довідник · WebGL / GLSL
📅 Березень 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) Переповнюється до +∞ для великих x; для основи 2 використовуйте exp2
log(x) ln(x) Невизначена поведінка, якщо x ≤ 0
exp2(x) Апаратно прискорена на більшості 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). Використовуйте для перевірки близькості.
dot(x, y) float dot(genType x, genType y) Скалярний добуток. > 0: одна півсфера. = 0: перпендикулярні. Від’ємний: протилежні боки.
cross(x, y) vec3 cross(vec3 x, vec3 y) Векторний добуток. Результат ⊥ до обох входів. |cross| = |x|·|y|·sin(θ).
normalize(x) genType normalize(genType x) x / length(x). Невизначена поведінка, якщо length = 0. Результат має довжину 1.0.
faceforward(N,I,Nref) genType faceforward(genType N, genType I, genType Nref) Повертає N, якщо dot(Nref,I) < 0, інакше −N. Використовуйте для двосторонніх нормалей.
reflect(I, N) genType reflect(genType I, genType N) I − 2·dot(N,I)·N. N має бути нормалізованим. I — напрямок падіння (до поверхні).
refract(I, N, eta) genType refract(genType I, genType N, float eta) Заломлення за законом Снеліуса. eta = n1/n2. Повертає (0,0,0) при повному внутрішньому відбитті (перевіряйте dot перед використанням).
// Дифузне освітлення Фонга + блиск за один прохід
vec3 N = normalize(vNormal);
vec3 L = normalize(uLightPos - vWorldPos);
vec3 V = normalize(uCamPos - vWorldPos);
vec3 R = reflect(-L, N);

float diff = max(dot(N, L), 0.0);
float spec = pow(max(dot(R, V), 0.0), uShininess);
vec3 color = diff * uDiffuse + spec * uSpecular;

6. Матричні функції

Функція Сигнатура Опис
matrixCompMult(x, y) mat matrixCompMult(mat x, mat y) Покомпонентне множення матриць. НЕ те саме, що матричний добуток (для нього використовуйте *).
outerProduct(c, r) mat outerProduct(genType c, genType r) Вектор-стовпець × вектор-рядок → матриця. mat3 = outerProduct(vec3, vec3).
transpose(m) mat transpose(mat m) Рядки стають стовпцями. Для ортогональної матриці (чистого обертання) транспонування = обернена матриця.
determinant(m) float determinant(mat m) Лише ES 3.0. Ненульовий = матриця оборотна.
inverse(m) mat inverse(mat m) Лише ES 3.0. Невизначена поведінка, якщо визначник ≈ 0. Для матриці нормалей: використовуйте transpose(inverse(modelMatrix)).
Оператор множення матриць: mat4 * vec4 = добуток матриці на вектор (вектор-стовпець праворуч). vec4 * mat4 = вектор-рядок ліворуч (семантика транспонування). У вершинних шейдерах для MVP використовуйте mat4 * vec4.

7. Функції вибірки з текстур

GLSL ES 3.0 використовує типи семплерів і перевантаження texture(). GLSL ES 1.0 (WebGL 1) використовував texture2D(), textureCube() тощо.

Функція Семплер Нотатки
texture(s, P) gsampler2D, gsampler3D, gsamplerCube, gsampler2DArray… Стандартна вибірка з текстури за координатами P. Рівень мипу обчислюється автоматично (лише у фрагментному шейдері — потребує похідних).
textureLod(s, P, lod) Усі наведені вище Явний рівень мипу. Використовуйте у вершинному шейдері або для ручного керування LOD.
textureOffset(s, P, offset) gsampler2D тощо. Сталий цілочисловий зсув текселя для вибірки сусідів (Собель, розмиття тощо).
texelFetch(s, P, lod) gsampler2D тощо. P — цілочислові координати текселя — без фільтрації, без обгортання, без міпмапінгу. Для текстур даних.
textureSize(s, lod) gsampler2D тощо. Лише ES 3.0. Повертає розміри текстури як ivec2 на заданому рівні мипу. Використовуйте для обчислень у піксельному просторі.
textureGrad(s, P, dPdx, dPdy) Усі наведені вище Явний градієнт для вибору мипу. Просунуте використання: карти тіней, анізотропна фільтрація.
texture2D(s, P) sampler2D (ES 1.0) 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 вони доступні завжди.