Podstawy oświetlenia.
Oto przed nami zupełnie nowa, otwierająca przed nami nowe horyzony część tego kursu. Zajmiemy się w tej i następnych lekcjach czymś, do czego jesteśmy przyzwyczajeni w rzeczywistym świecie, a nie widzieliśmy jeszcze w naszych programach. Nową tą rzeczą będzie oświetlenie. W tej lekcji zajmiemy się omówieniem poszczególnych modeli, a w następnej implementacją.
Toteż – czym jest oświetlenie? Na chłopski rozum – jest to “ilość” światła, jaka pada na dany piksel z danego kierunku. Logiczne i proste, ale jak to obliczyć? Tutaj mamy do dyspozycji parę sposobów. Ale najpierw zajmiemy się podziałem oświetlenia.
Oświetlenie Diffuse – roproszone – to najprostszy rodzaj oświetlenia do zaimplementowania. Powstawanie tego efektu w rzeczywistości tłumaczy poniższy obrazek:
Istnieje parę metod aproksymacji oświetlenia diffuse w grafice komputerowej. Najpowszechniejszą jest metoda Lamberta - i to właśnie jej będziemy używać. Otóż mądry ten szwajcar wymyślił, iż współczynnik oświetlenia diffuse równy jest kosinusowi kąta między wektorem kierunku światła, a wektorem normalnym oświetlanej powierzchni. Stąd prosty wzór na obliczenie:
diffuseLight = dot(normalize(surfaceNormal), normalize(lightDirection));
Jeśli zadbamy, żeby długości wektorów były równe 1 (normalizacja), iloczyn skalarny da nam w wyniku kosinus kąta między tymi dwoma wektorami – a więc to, o co nam chodzi! Efekt tego działania jest mniej-więcej taki:
Drugim rodzajem oświetlenia o jakim powiemy, jest oświetlenie Specular, czyli rozbłysk. Polskie tłumaczenie jest zgoła dosyć nieudolne, ale obrazuje o czym mowa. Mianowicie, światło padając na powierzchnię pod odpowiednim kątem utworzy błyszczące miejsce. Pokazuje to grafika niżej.
Oświetlenie specular możemy obliczyć dwoma sposobami.
Zgodnie z poprawniejszym fizycznie modelem Phonga, na podstawie formuły
pow(dot(normalize(reflectedLightDir), normalize(pixelToCamDir)), specPower);
lightDir to kierunek padania światła, N to normalna powierzchni, reflectedLightDir to pomocniczy wektor – padanie światła odbite od powierzchni. Współczynnik specular to podniesiony do potęgi specPower kosinus pomocniczego wektora odbitego i kierunku od piksela do kamery – kąta β.
Dobra, tutaj mała dygresja. Wspomniałem o czymś takim jak wektor normalny powierzchni (normalna). Pod tą szumną nazwą kryje się ni mniej ni więcej niż jednostkowy wektor skierowany prostopadle do powierzchni. Nie należy mylić jednak normalnej z wektorem znormalizowanym - czyli o długości 1.
Model Phonga daje w wyniku taki oto obrazek:
Na starszych komputerach, jednak, często stosowano optymalizację – prostszy algorytm Blinna.
Dokładna implementacja wymaga parę instrukcji shadera mniej, co wyjaśnimy sobie w następnej lekcji. Tymczasem, obejrzmy jakie efekty daje podejście oparte o model Blinna:
Wyróżniamy jeszcze inne składniki oświetlenia, jak Emmisive i Ambient, ale w standardowym podejściu są one realizowane przez stały wektor, więc nie ma sensu zajmować się nimi. Istnieją co prawda metody innego realizowania oświetlenia Ambient (tzw. Ambient Occlusion), jednak są one skomplikowane i na razie wykraczają poza ramy tego kursu.
Jako, iż ta krótka lekcja była jedynie podstawą teoretyczną pod następne, nie jest do niej dołączony kod źródłowy. Nie oznacza to jednak, że jest ona gorsza lub mniej ważna od pozostałych; wręcz przeciwnie – gdyż od dzisiaj, już zawsze wykorzystywać będziemy podstawy których się nauczyliśmy.
Na koniec copyright notice: niektóre obrazki (konkretniej – jedyne dwa ładne, niebędące zrzutami) są zapożyczone z książki Cg Tutorial.

Bardzo fajnie że ten kurs dalej powstaje, czekam na następne lekcje.
Charibo kiedy następne lekcje? ;>