Dynamiczne oświetlenie
A
A
A
rozmiar czcionki
Stawiając pierwsze kroki w fotografii lub amatorskim tworzeniu filmów wideo, bardzo szybko odkrywamy, że jakość uzyskiwanego obrazu zależy przede wszystkim od światła padającego na utrwalane obiekty. Nie inaczej jest w grafice komputerowej. Rola światła jest tutaj kluczowa, decyduje o stopniu realizmu i jakości obrazu generowanego na ekranie monitora. Na szczęście za pomocą jednostek cieniujących i języków programowania HLSL i GLSL można łatwo kontrolować oświetlenie w scenie 3D.
Nasze zadanie
Postaramy się utworzyć aplikację wyświetlającą kilka trójwymiarowych modeli, między którymi będziesz mógł przeskakiwać za pomocą klawiatury. Dodatkowo wiele innych opcji pozwoli na sterowanie typem, kolorem, a także natężeniem światła w scenie 3D. Przetwarzanie geometrii i wszystkie obliczenia związane z oświetleniem będą wykonywane za pomocą jednego shadera wierzchołków.

Model dinozaura wyrenderowany przy użyciu oświetlenia, od lewej: otaczającego, rozproszonego, połysku oraz sumy oświetlenia rozproszonego i połysku.W grafice komputerowej obowiązują te same zasady, co w rzeczywistości. W momencie kontaktu światła z obiektem zachodzą dwa zjawiska. W pierwszej kolejności następuje interakcja światła z powierzchnią obiektu. Promień zostaje ood niego odbity zgodnie z właściwościami materiału, z którego obiekt jest zbudowany. Ciała o gładkiej powierzchni odbijają światło w jednym kierunku (np. lustro). Obiekty o powierzchni matowej powodują rozproszenie padającego światła (np. matowa, chropowata ściana). Drugie zjawisko wiąże się z wnikaniem promieni do wnętrza ciała. W zależności od właściwości materiału światło może zostać zaabsorbowane, przepuszczone lub rozproszone w nim i dopiero potem przepuszczone. Zwykle wszystkie te zjawiska następują równolegle. Równie istotna jest barwa obiektu: promienie padające na powierzchnię są odbijane lub pochłaniane, w zależności od koloru światła i ciała. Jeżeli widzisz jakiś przedmiot na czerwono, oznacza to, że odbija on całe światło czerwone, a resztę pochłania. Jeżeli oświetlisz taki przedmiot wyłącznie światłem niebieskim, niezawierającym koloru czerwonego, nabierze barwy czarnej. Pochłonie padające na niego światło niebieskie, nie odbijając w zamian żadnego, które mogłoby dotrzeć do twoich oczu.
Rodzaje oświetlenia
W grafice komputerowej czasu rzeczywistego obliczenia związane z oświetleniem nie mogą trwać długo, bo znacząco spowolniłoby to renderowanie sceny. Dlatego wyróżniamy cztery podstawowe typy oświetlenia o różnym poziomie skomplikowania.
Światło otaczające (ang. ambient light) wypełnia całą renderowaną scenę równomiernie. Jeżeli wyświetlasz sześcian, który znajduje się w jakimś pomieszczeniu, to bez względu na jego położenie i orientację, każda z jego ścian będzie oświetlona przez światło otaczające w ten sam sposób, z tą samą intensywnością. Nie ma przy tym znaczenia, jaki model cieniowania zastosujesz, płaski czy efektowniejszy, Gourauda. Każdy wierzchołek zostanie oświetlony identycznie, dlatego obiekt będzie miał jednolitą barwę (i będzie widoczny dla ewentualnego obserwatora). Światło otaczające nie ma pozycji ani kierunku. Stanowi pewien poziom jasności sceny. Jedyne jego atrybuty to kolor i intensywność.

Modulacja koloru polega na przemnożeniu przez siebie odpowiednich składowych barwy światła i materiału.Oświetlenia otaczającego powinieneś używać do symulowania ogólnego oświetlenia w scenie, aby oddać nastrój panujący w pomieszczeniu. Dobry przykład wykorzystania go to efekty atmosferyczne. Zmianę słonecznego dnia w pochmurny można zasymulować, zmniejszając intensywność światła otaczającego. Wszystkie obiekty w scenie równomiernie zbledną, jakby słońce znikło za obłokiem.
Światło otaczające jest jedno i nie zależy od pozostałych świateł w scenie. Jeżeli jest w niej wyłącznie światło otaczające, końcowy kolor wierzchołka jest z nim zgodny.
Światło emitowane (ang. emitted light) nie pochodzi z typowego źródła znajdującego się w scenie, bo wydziela je sam obiekt. Przedmiot albo świeci, albo nie. Światło emitowane dodawane jest do końcowego koloru obiektu, za jego pomocą możesz uzyskać takie same efekty wizualne, jak w wypadku światła otaczającego.
Z oświetleniem rozproszonym (ang. diffused light) mamy do czynienia wówczas, gdy promienie padają na jakąś powierzchnię i odbijając się od niej, wędrują do naszego oka. W tym aspekcie nie różni się ono od pozostałych rodzajów oświetlenia. Aby jednak nastąpiło rozproszenie, w scenie musi się znaleźć źródło światła mającego kierunek (punktowe, reflektorowe, kierunkowe). Jego promienie padają tylko na te płaszczyzny obiektu, które są skierowane do źródła; ściany znajdujące się z tyłu nie są oświetlane - tak samo, jak lampa w pokoju nie rozjaśnia piwnicy. W wypadku oświetlenia rozproszonego musisz pamiętać o współczynniku intensywności oświetlenia, którego wartość zależy od wzajemnego położenia źródła światła i orientacji oświetlanej płaszczyzny.
Oświetlenie rozproszone obliczamy, sumując światło emitowane przez poszczególne źródła. Uzyskany wynik dodawany jest do końcowego koloru obiektu.
Z połyskiem (ang. specular light) mamy do czynienia wówczas, gdy wyemitowane światło odbija się od gładkiej powierzchni i podlegając znikomemu rozproszeniu - bądź w ogóle nie rozproszone - trafia wprost do naszego oka. Połysk jest niezwykle często spotykany i na wielu powierzchniach widoczny jako znacznie jaśniejsza plama. Należy pamiętać, że jego intensywność zależy nie tylko od kąta padania światła, ale również od kąta, pod jakim obserwujemy obiekt.
| Wymagania | | Przygotowując ten artykuł, założyliśmy, że masz odpowiednie narzędzia i coś wiesz o tworzeniu aplikacji 3D. Główne wymagania to: podstawowa umiejętność programowania w języku C++, ogólna wiedza na temat grafiki 3D oraz doświadczenie w programowaniu z wykorzystaniem biblioteki DirectX Graphics. Przyda się także znajomość podstaw języka HLSL, który wykorzystamy do utworzenia programu cieniującego wierzchołki. Poza tym powinieneś zaopatrzyć się w takie narzędzia, jak DirectX SDK 9 i Visual Studio 2005. Znajdziesz je na stronie http://www.microsoft.com . |
|