Sposób na światło

W poprzednich częściach cyklu o sprzętowym generowaniu grafiki (patrz: $(LC123937:Trójwymiarowa rewolucja)$, i $(LC126772:Fotorealizm 3D)$) opowiedzieliśmy, jak współczesne akceleratory 3D tworzą szkielet sceny i nakładają na niego tekstury. Teraz zajmijmy się dwoma kolejnymi etapami renderingu: cieniowaniem oraz efektami postprocessingowymi, czyli m.in. dodawaniem mgieł, dymu i rozmazywaniem konturów oddalonych obiektów, tak jak można to zaobserwować w rzeczywistym świecie.

Same tekstury to za mało

Jeżeli mielibyśmy okazję przyjrzeć się jakiejś niedokończonej scenie 3D (np. w demie czy grze), gdzie można zatrzymać wyświetlanie obrazu zaraz po skończeniu teksturowania, pierwszą rzeczą, jaka zwróciłaby naszą uwagę, byłyby co prawda ładne, lecz dziwnie nienaturalnie wyglądające powierzchnie. Tak się bowiem składa, że nawet najlepsza tekstura nie jest w stanie odtworzyć gry świateł i cieni, jaką obserwujemy w codziennym życiu. To właśnie odpowiednie “oświetlenie” sceny sprawia, że przedmioty nabierają głębi i stają się “przestrzenne”. Wówczas, tak jak w rzeczywistości, blisko położone obiekty będą jaśniejsze, a te oddalone ciemniejsze. Oczywiście nie wolno też zapomnieć o refleksach światła pochodzących od gładkich, wypolerowanych powierzchni oraz wielu różnorodnych jego źródłach (np. punktowych, rozproszonych czy wielokolorowych), które znajdują się na całej scenie – nie tylko na widocznym dla obserwatora kadrze.

Cały ten proces, jak już wspomniałem, nazywa się cieniowaniem (ang. shading). W największym skrócie polega on na zamianie wektorów natężenia światła, obliczonych dla każdego trójkąta już na etapie kalkulacji oświetlenia (patrz: $(LC123937:Trójwymiarowa rewolucja)$), na teksele o odpowiedniej jasności i kolorze, które należą do tekstury wypełniającej dany trójkąt. Jak można się domyślić, od dokładności obliczeń, sposobu wyboru rozjaśnianych bądź przyciemnianych punktów oraz metody zmieniającej pierwotną barwę tekstury (modyfikacja składowych RGB) w zależności od natężenia światła zależy efekt, jaki zobaczymy na ekranie.

1a. Cieniowanie płaskie i metoda Gourauda

Najstarszą i najprostszą metodą cieniowania jest cieniowanie płaskie (ang. flat shading). Polega ono na przyporządkowywaniu kolejnym powierzchniom jednego poziomu jasności oraz jednej barwy. Są one określone przez wektor przypisany do jednego z wierzchołków przetwarzanego trójkata. Zazwyczaj do operacji cieniowania płaskiego wybiera się te wierzchołki, które znajdują się najbliżej obserwatora. Innymi słowy, każdemu trójkątowi przypisuje się, niezależnie od otaczających go wielokątów, jeden ściśle określony odcień. Niestety, cieniowanie płaskie daje dość nieciekawy efekt “kanciastości” obiektów, wynikający z gwałtownych zmian jasności przylegających do siebie trójkątów. Widać to szczególnie wyraźnie na okrągłych przedmiotach, takich jak np. kula czy torus.

Znacznie lepsze rezultaty, pozbawione efektu “kanciastości”, daje metoda Gourauda (ang. Gouraud shading). Tutaj korzysta się z wersora oświetlenia przypisanego do środka trójkąta. Powstaje on z uśrednienia trzech wektorów oświetlenia pochodzących z trzech wierzchołków trójkąta. Dzięki temu uwzględniona zostaje również jasność sąsiednich wielokątów. Często w metodzie Gourauda do wnętrza trójkąta wkłada się nie jeden, ale kilka interpolowanych wersorów normalnych natężenia światła. Rozmieszczone są one wzdłuż linii przechodzącej przez trójkąt i biegnącej od obserwatora do punktu w nieskończoności. W efekcie w jednym trójkącie mamy kilka obszarów o różnym natężeniu światła i w ten sposób zachowane zostają płynne przejścia poziomów jasności pomiędzy poszczególnymi wielokątami. Co ciekawe, cieniowanie Gourauda daje też złudzenie gładkości sferycznych obiektów złożonych nawet z niewielkiej liczby wielokątów.

Oczywiście przedstawiona wyżej metoda ma również swoje wady, które widać wtedy, gdy punktowe źródło światła znajduje się prostopadle do oświetlanej powierzchni. Teoretycznie, tak jak w rzeczywistym świecie, powinniśmy wówczas ujrzeć na powierzchnii przedmiotu kilka współśrodkowych okręgów z odbłyskami światła. Niestety, tak się nie dzieje, gdyż efekt ten ginie na skutek liniowej interpolacji natężenia światła.

Więcej:bezcatnews