🎨 Комп'ютерна графіка · Шейдери
📅 Березень 2026 ⏱ ≈ 11 хв читання 🟡 Середній · Останнє оновлення: 23 червня 2026 р.

Фізично коректний рендеринг (PBR)

PBR — це стандартна модель шейдингу для сучасної графіки в реальному часі. Замість довільних повзунків «дифузне + дзеркальне + блиск», вона моделює світло так, як це робить фізика — мікрофасетки, відбивання за Френелем та збереження енергії — використовуючи на вході лише металевість і шорсткість.

1. Рівняння рендерингу

Джеймс Каджія (1986) сформулював головне рівняння, яке має задовольняти кожен фізично коректний рендерер:

Рівняння рендерингу (Каджія, 1986) L_o(x, ωo) = L_e(x, ωo) + ∫_Ω f_r(x, ωi, ωo) · L_i(x, ωi) · (ωi · n̂) dωi

L_o — вихідна яскравість у напрямку ωo
L_e — випромінювана яскравість
f_r — BRDF: двонапрямлена функція розподілу відбивання
L_i — вхідна яскравість із напрямку ωi
ωi · n̂ = cos θ (косинусний член Ламберта)

Точне розв'язання цього інтеграла потребує трасування шляхів. PBR у реальному часі апроксимує його за допомогою: (1) прямих точкових джерел світла та (2) попередньо обчислених карт оточення для дифузного та дзеркального інтегралів.

2. Теорія мікрофасеток

На мікроскопічному рівні жодна поверхня не є ідеальним дзеркалом. Кожна поверхня — це сукупність крихітних плоских мікрофасеток, кожна з яких — ідеальне дзеркало, але орієнтоване випадково. Розподіл орієнтацій мікрофасеток визначає макроскопічний вигляд.

Шорстка поверхня має багато фасеток, спрямованих у випадкових напрямках → великі, дифузні на вигляд відблиски. Гладка поверхня має фасетки, майже всі вирівняні з нормаллю поверхні → крихітні, різкі дзеркальні «гарячі точки».

Шорсткість α² = roughness², де roughness ∈ [0, 1] — це введене художником значення. Два ефекти зменшують кількість видимих відбивальних фасеток:

3. Члени BRDF Кука — Торренса

Мікрофасетковий дзеркальний BRDF (Кука — Торренса) має три члени:

Дзеркальний BRDF Кука — Торренса f_cook = D(h) · G(l, v) · F(v, h) / (4 (n·l)(n·v))

D — функція нормального розподілу (скільки фасеток обернено до h)
G — член геометрії/маскування (самозатінення)
F — член Френеля (відбивання залежно від кута)
D — GGX / Троубридж — Рейтц

D(h, α) = α² / (π · ((n·h)²(α²−1) + 1)²). Найпопулярніший: чудово виглядає, швидко семплюється.

G — Сміт / Шлік-GGX

G(n,v,k) = (n·v) / ((n·v)(1−k)+k), k = α²/2 (пряме світло). Застосовується окремо для напрямків зору + світла.

F — Френель — Шлік

F = F₀ + (1 − F₀)(1 − cosθ)⁵. Просто, точно. F₀ — це відбивання за нормального падіння.

Повний BRDF = дзеркальний Кука — Торренса + дифузний Ламберта, зважений за членом Френеля: дифузний внесок дорівнює (1 − F) × albedo / π. Метали поглинають усе заломлене світло → дифузного члена немає.

4. Френель і F₀

F₀ — це відбивання за нормального падіння (кут падіння 0°). Це «базове відбивання» поверхні:

Під ковзними кутами (близько 90°) усе стає сильно відбивальним — ви можете бачити відображення неба на гладкому озері, навіть попри те, що вода має низький F₀. Це ефект Френеля, а степеневий закон (1 − cosθ)⁵ — напрочуд гарне наближення для більшості матеріалів.

F₀ із показника заломлення (IOR): Для діелектриків F₀ = ((n−1)/(n+1))². Скло з IOR = 1,5 → F₀ = ((1.5-1)/(1.5+1))² = 0,04 (4% за нормального падіння).

5. Робочий процес металевість — шорсткість

Художники використовують три текстурні карти. Це «робочий процес металевості», який використовують Three.js, Unreal Engine, Unity, Blender та glTF:

Додаткові необов'язкові карти: нормалей, амбієнтного затінення, випромінювання, висоти.

Робочий процес дзеркальність — глянсуватість: Старіша альтернатива, яку використовували деякі конвеєри епохи Блінна — Фонга (дзеркальність зберігається явно як RGB). Менш зручна для художника та схильніша до значень, що не зберігають енергію. MetalnessRoughness тепер є галузевим стандартом (ядро glTF 2.0).

6. Освітлення на основі зображень (IBL)

Точкові джерела світла (точкове, напрямлене, прожекторне) покривають лише частку реального освітлення. IBL використовує HDR-карту оточення як нескінченну сферу площинних джерел світла. Інтеграл рівняння рендерингу розбивається:

Усі три текстури обчислюються один раз офлайн. IBL у реальному часі зі статичних оточень за вартістю на кадр по суті «безкоштовне».

7. PBR-шейдер на GLSL

Основні функції BRDF Кука — Торренса в GLSL ES 3.0:

const float PI = 3.14159265359;

// Функція нормального розподілу GGX
float D_GGX(float NdotH, float roughness) {
  float a  = roughness * roughness;
  float a2 = a * a;
  float d  = (NdotH * NdotH) * (a2 - 1.0) + 1.0;
  return a2 / (PI * d * d);
}

// Геометрична функція Сміта — Шліка
float G_SchlickGGX(float NdotV, float roughness) {
  float r = roughness + 1.0;
  float k = (r * r) / 8.0;
  return NdotV / (NdotV * (1.0 - k) + k);
}
float G_Smith(float NdotV, float NdotL, float roughness) {
  return G_SchlickGGX(NdotV, roughness)
       * G_SchlickGGX(NdotL, roughness);
}

// Fresnel-Schlick
vec3 F_Schlick(float cosTheta, vec3 F0) {
  return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

// Повний BRDF Кука — Торренса (одне напрямлене світло)
vec3 PBR(vec3 N, vec3 V, vec3 L,
         vec3 albedo, float roughness, float metalness) {

  vec3 H = normalize(V + L);
  float NdotV = max(dot(N, V), 0.0001);
  float NdotL = max(dot(N, L), 0.0);
  float NdotH = max(dot(N, H), 0.0);
  float VdotH = max(dot(V, H), 0.0);

  // F0: діелектрик = 0.04, метал = albedo
  vec3 F0 = mix(vec3(0.04), albedo, metalness);

  float D = D_GGX(NdotH, roughness);
  float G = G_Smith(NdotV, NdotL, roughness);
  vec3  F = F_Schlick(VdotH, F0);

  vec3 specular = (D * G * F) / (4.0 * NdotV * NdotL + 0.001);

  vec3 kD = (1.0 - F) * (1.0 - metalness);  // метали: без дифузного
  vec3 diffuse = kD * albedo / PI;

  return (diffuse + specular) * NdotL;
}
Three.js MeshStandardMaterial використовує саме цю модель PBR. Ви можете поєднати власний шейдер із THREE.ShaderMaterial та підключити вбудовані GLSL-фрагменти Three через #include <lights_pars_begin>, щоб автоматично отримати джерела світла сцени.