N·L · DIFFUSEN·H · SPECULARSHININESS · 32AMBIENT · ON
Rozdział 5 / Shading

Modele oświetlenia: Lambert i Blinn-Phong

Mamy punkt trafienia i normalną z Rozdziału 4. Czas zamienić to w kolor na ekranie — pierwsze wzory, które faktycznie decydują, jak wygląda materiał w Twoim renderze.

TL;DR
Pass: Diffuse

Światło rozproszone: prawo Lamberta

Powierzchnia matowa — kreda, nieszkliwiona ceramika, papier — rozprasza padające światło równomiernie we wszystkie strony. Ilość odbitego światła zależy tylko od kąta, pod jakim światło pada na powierzchnię. To prawo cosinusów Lamberta (1760 r., najstarszy wzór w tej książce).

diffuse = kd · I · max(0, N · L)N — normalna (znormalizowana); L — wektor od punktu trafienia do światła (znormalizowany); kd — kolor/albedo materiału; I — intensywność światła

Intuicja: światło padające pod kątem „rozmazuje się” na większej powierzchni, więc na jednostkę powierzchni przypada go mniej. Padające prostopadle skupia całą energię w jednym miejscu — a dokładnie tyle mówi cosinus kąta między N i L, czyli iloczyn skalarny dwóch wersorów z Rozdziału 2. max(0, …) obcina wynik, gdy światło jest za powierzchnią — ten sam rodzaj odrzucenia, co przy ujemnym t w Rozdziale 2 czy backface culling w Rozdziale 4.

Lambert.anglediffuse = kd·I·(N·L)
θ = 45° · N·L = 0,71
N L światło pod horyzontem — N·L=0
Przesuń θ — jasność swatcha to na żywo max(0, N·L), dokładnie ten sam wzór co wyżej.
Pass: Specular

Odbicie zwierciadlane: potrzebujemy widza

Sam diffuse wygląda płasko — jak niewykończone drewno albo gips. Prawdziwe materiały mają błysk (specular highlight), który zależy od tego, skąd patrzysz, nie tylko skąd świeci światło. Do wzoru wchodzi trzeci wektor: V, kierunek do kamery.

Oryginalny Phong (1975): policz R = 2(N·L)N − L, czyli odbicie L względem N, a potem specular = ks · I · max(0, R·V)^shininess.

Blinn-Phong (1977): zamiast liczyć R, użyj wektora half-way H = normalize(L + V) — leżącego w połowie drogi między L i V — i policz max(0, N·H)^shininess. Inny wzór matematycznie, ale wizualnie bardzo podobny błysk, a dużo taniej: żadnego liczenia odbicia, tylko dodawanie i normalizacja.

H = normalize(L + V)
specular = ks · I · max(0, N · H)^shininessH — wektor „w pół drogi” między L i V; ks — kolor/intensywność odbicia specular (analogicznie do kd dla diffuse); shininess — wykładnik: im wyższy, tym węższy i ostrzejszy błysk
Blinn-Phong.vectorsH vs R
V obrócone o 55° · H=normalize(L+V) · N·H=0,79
N L V H
Przesuń V — H = normalize(L+V) przelicza się na żywo; N·H rośnie, gdy V zbliża się do lustrzanego odbicia L.

Wykładnik shininess kontroluje rozmiar i ostrość błysku: niski (np. 8) daje szeroki, rozmyty refleks — plastik, matowa farba; wysoki (128+) daje mały, ostry punkt — polerowany metal, mokra powierzchnia. To dokładnie ten sam parametr, który w silnikach PBR chowa się pod nazwą „glossiness”, albo odwrotnością „roughness”.

Pass: Kompozycja

Składanie modelu: ambient + diffuse + specular

Klasyczny model Phonga to suma trzech składników: ambient (stała, przybliżająca odbite światło otoczenia — ta sama „sztuczka” co light probes z Rozdziału 1, tylko w najprostszej możliwej wersji), diffuse i specular, zsumowane dla każdego światła w scenie.

color = ka·Ia + Σ [ kd·I·max(0,N·L) + ks·I·max(0,N·H)^shininess ]suma po wszystkich światłach w scenie; ka·Ia liczone raz, niezależnie od ich liczby
Shading.buildup3 layers
AMBIENT + DIFFUSE + SPECULAR
Beauty = ambient + diffuse + specular — dokładnie ta sama logika co warstwy AOV w kompozycji.

To dosłownie ta sama logika co warstwy w kompozycji albo AOV-y w Nuke: beauty = ambient + diffuse + specular (i czasem więcej). Model Phonga po prostu liczy je analitycznie, wzorem, zamiast renderować każdą warstwę osobno.

Z praktyki

Jeśli budowałeś kiedyś graf materiału w Unreal, Unity albo Blenderze — „Roughness” i „Glossiness” to w praktyce ten sam shininess, tylko przeliczony i odwrócony: niższy roughness = wyższy shininess = mniejszy, ostrzejszy błysk.

Blinn-Phong jest wciąż wszędzie: w prostych shaderach mobile/VR, w starszych silnikach gier, i jako punkt odniesienia przy uczeniu shadingu — ale nie zachowuje energii (może „świecić” jaśniej niż padające światło). Właśnie to naprawia PBR i modele mikrofasetkowe, które budują na dokładnie tych samych wektorach N, L, V, H.

Słowniczek
Prawo Lamberta / diffuse shading
Jasność rozproszona proporcjonalna do N·L.
Wektor do światła (L)
Znormalizowany, od punktu trafienia do źródła światła.
Wektor widza (V)
Znormalizowany, od punktu trafienia do kamery.
Wektor half-way (H)
normalize(L + V); używany w Blinn-Phongu zamiast R.
Shininess / glossiness
Wykładnik kontrolujący rozmiar i ostrość błysku specular.
Człon ambient
Stała aproksymacja światła otoczenia; zapobiega czystej czerni w cieniu.
Idź głębiej
Dodatek U — Kąt bryłowy i geometria sferyczna Dodatek AL — Light linking i light groups