Grafika 3D
 
  Zarejestruj się
::  Newsy  ::  Pliki  ::  Twoje Konto  ::  Forum  ::
Menu
· Strona główna
· Forum
· Linki
· Lista u?ytkowników
· O nas...
· Pliki
· Statystyki
· Twoje Konto
Tutoriale
· API
· Matematyka
· Teoria
· Direct3D
· OpenGL
· Techniki
Kto Jest Online
Aktualnie jest 38 gość(ci) i 0 użytkownik(ów) online.

Jesteś anonimowym użytkownikiem. Możesz się zarejestrować za darmo klikając tutaj
Tutoriale - Techniki - Cienie płaskie

Cienie płaskie

Po zapoznaniu się z technikami oświetlania sceny w grafice 3D i co ważniejsze, ich zastosowaniu można się cieszyć w miarę realistycznymi scenami, które wyglądają oczywiście o niebo lepiej, niż plastikowe bryły, które tylko składają się z kolorowych wierzchołków ubranych ewentualnie w różnokolorowe tekstury. Zastosowanie mapowania wypukłości dodatkowo zwiększa efekt wywarty na widzu, ponieważ przybliża obiekt do bardzo rzeczywistego wyglądu. No, ale przecież nie samymi obiektami człowiek żyje i chciałby je jednak oglądać w jakimś milszym otoczeniu a nie na tle niebieskiego czy czarnego tła. Do tego celu oczywiście tworzymy sceny, w których obiekty umieszczamy. No ale w momencie umieszczenia obiektu na scenie przychodzi jak w większości przypadków rozczarowanie - bo oto okazuje się nagle, że wszystko ładnie oświetlone, wymodelowane i uwypuklone ale nie współgra w żaden sposób z naszą sceną. I albo wygląda śmiesznie albo nawet tragicznie i nadaje się tylko do wyrzucenia albo przeróbki.
W czym problem? Najczęściej w tym, że obiekt zupełnie nie identyfikuje się z otoczeniem, w którym się znajduje. Może i owszem mieć zaaplikowane mapowanie środowiskowe i odbijać to, co dookoła niego się dzieje, ale w większości przypadków będziemy mieć wrażenie ze to trochę za mało, bowiem oczywistym faktem jest to, że nie tylko otoczenie wpływa na obiekt, ale także obiekt na otoczenie. I co bardzo charakterystyczne, w większości przypadków wpływu tego nie da się zamodelować za pomocą mapowania środowiskowego, (bo i nie po to ono jest).
Wyobraźmy sobie taką scenę - pofalowany delikatnie teren, na nim stoi dom, parę drzew, świeci ładne słonko (mmm... jakże sielsko nam się zrobiło :D). Jeśli zrobić wszystko tak jak to potrafimy to będzie dosyć ładnie, ale jednak coś będzie nas kłuło w oczy - a mianowicie teren w pobliżu domu i drzew, bo jeśli przyjrzymy mu się z bliska to okaże się, że wygląda tak, jakby nic na nim nie stało - będzie oczywiście brakować cieni tego wszystkiego, co na tym terenie się znajduje, zwłaszcza gdy będzie świecić mocne słońce. Trzeba by, więc te cienie jakoś do tego terenu dodać, żeby scenka nabrała trochę życia i była bardziej realistyczna. Sposobów jest jak to zwykle bywa kilka, każdy też ma swoje wady i zalety, jeśli chodzi o wykorzystanie go w grafice 3D czasu rzeczywistego. Kryteriów wyboru metody generowania efektu także jest kilka:

  • czas, jaki jest potrzebny na wygenerowanie i narysowanie efektu cienia,
  • możliwości sprzętu jakim dysponujemy,
  • potrzeba precyzji efektu,

Co zaś się tyczy metod - można oczywiście wymyślać różne podejscia robiąc przy okazji różne założenia przy dostępnych środkach. Przypatrzmy się może kilku narzucającym się niemal od razu w przypadku naszej przykładowej sceny:

  • przy nakładaniu tekstur na teren możemy nałożyć w n-tym przebiegu teksturę, która będzie udawała cień tego, co stoi. Co dobre w tej metodzie to to, że prawie nic nie kosztuje. Teksturę możemy sobie wygenerować wcześniej jakimiś tajemniczymi narzędziami, umiejscowić cień będzie może troszkę trudniej, ale da się no, ale ma to jedną zasadniczą wadę, – kiedy słońce czy światełka zaczną nam się poruszać po scenie będzie wstyd, bo cień nie bardzo będzie wstanie podążać za zmianami światła,
  • możemy zrobić to tak, jak w przyrodzie się dzieje naprawdę, czyli policzyć to, jak zachowują się promienie światła przy przechodzeniu przez obiekty i jak padają na powierzchnie. Metoda dająca świetne rezultaty przy dynamicznym oświetleniu, niestety tak obliczeniożerna, że praktycznie się nie nadaje do naszych rozważań, przynajmniej na pierwszy rzut oka,
  • możemy też zrobić to, co robią dzisiaj wszyscy w grafice 3D, nie wyłączając nas ;), czyli bezczelnie przybliżyć, oszukać i na samym końcu zakpić z widza pokazując mu zupełną nieprawdę – a jak tego dokonać dowiemy się właśnie w tym artykule ;D

Od razu na wstępie tego tutoriala uczciwie zaznaczam, że przedstawiona przez mnie metoda nie nadaje się do większości zastosowań :D, ale tam, gdzie się da, to należy ją jednak stosować. A dlaczego? Jej największą i niebagatelną zaletą jest to, że jest stosunkowo tania jeśli chodzi o obliczenia a efekty są zdumiewająco dobre jak na wysiłek włożony w wygenerowanie efektu. Sytuacje, o których mowię (czyli te nadające się do wykorzystania naszej metody) to sceny, które zawierają duże, praktycznie płaskie powierzchnie, na których mieści się cień obiektu, który chcemy uzyskać. Można na upartego cienie takie rzucać także na nieco bardziej wypukłe powierzchnie, ale im bardziej będzie nierówno, tym efekt gorszy. Po modyfikacjach można oczywiście rzucać takie cienie na dowolną powierzchnię złożoną z wielu mniejszych, ale mija się to z celem, ponieważ istnieją w takich przypadkach metody lepsze i bardziej sensowne. Na pewno nie ma sensu tą techniką rzucać cienia czajnika na kulkę lub odwrotnie. Ale cień czajnika albo kulki na podłogę - jak najbardziej!

Na czym więc polega cała sztuka w rzucaniu cieni na płaską powierzchnię? Otóż podstawowym założeniem jak już wiemy jest to, że cień ukaże się właśnie na niej. Dodatkowo bardzo pożądane byłoby to, aby cały cień obiektu mieścił się na omawianej płaszczyźnie docelowej, aby nie było potrzeby jego docinania do jej rozmiarów i kształtu (względy obliczeniowe). Przy takich założeniach efekt osiągniemy najmniejszym nakładem sił i będzie oczywiście w miarę szybki, co powinno nas bardzo uszczęśliwić :).
Ale nie możemy oczywiście zapominać o głównym bohaterze naszej opowieści.
Cieniem więc będzie... sam obiekt, który znajduje się w centrum naszego zainteresowania lub coś, co go udaje. Pisałem o oszukiwaniu wcześniej i tutaj jest dobry moment, aby przeprowadzić tę niezbyt grzeczną operację. Aby otrzymać cień obiektu musimy go po prostu spłaszczyć na powierzchnię, czyli tak przekształcić wszystkie jego wierzchołki, aby znalazły się na powierzchni i utworzyły cień. Aby tego dokonać wystarczy je po prostu przemnożyć przez pewne liczby i same tam grzecznie powędrują. Ktoś może poczuć się zapewne z lekka zaniepokojony w tym momencie, no bo powstaje pytanie - jeśli spłaszczymy nasz obiekt na daną powierzchnię, to stracimy go na naszej scenie. Oczywiście musimy tutaj zaznaczyć, że generować cień będziemy niejako na dwie raty. Czyli najpierw spłaszczymy i wyświetlimy cień a następnie oryginalny obiekt wyświetlimy sobie jak należy. W tym momencie dokonamy dodatkowo kilku oszustw na raz, ale efekt zadowoli na pewno każdego. Ale o szczegółach za chwilę, bo żeby myśleć o końcowym efekcie musimy najpierw poznać aparat matematyczny (znaczy się ten, no... wiecie ;). Cały czas trąbię o spłaszczaniu wierzchołków obiektu na powierzchnię, co będzie na pewno wymagało przeprowadzenia jakiś obliczeń. Nasza tylko w tym głowa, aby te obliczenia zajęły nam jak najmniej czasu bo inaczej efekt będzie zupełnie bezużyteczny. Cienie nie od dzisiaj słyną właśnie z tego, że są efektem, który pożera większość dostępnego czasu procesora, więc będziemy musieli się dzisiaj wyjątkowo wysilić, żeby wymyślić coś sensownego - zobaczymy z jakim skutkiem. Zanim jednak przejdziemy do szczegółów matematycznych jeszcze taki fragment na temat samych cieni. Otóz udajmy się nieco w stronę... światła, bo wiadomo, że bez niego żadnego cienia nie zobaczymy. O rodzajach światła mówiliśmy już wiele, poświeciliśmy im sporo miejsca i może nie będziemy do tego wracać, ale musimy sobie przypomnieć pewną prostą klasyfikację świateł, która ma ogromny wpływ nie tylko na wygląd oświetlonych obiektów ale także na cienie. Biroąc pod uwagę właśnie cienie największe znaczenie ma podział świateł ze względu na sposób rzucania przez nie promieni światła. Żeby za dużo nie smęcić powiedzmy po prostu, że są to światła:

  • rzucające promienie z jednego punktu, które rozchodzą się we wszyskich możliwych kierunkach - czyli tzw. światła punktowe (np. żarówki, latarki itp.),
  • rzucające promienie w sposób równoległy - czyli wszystkie są ułożone jak wiązka w jednym kierunku. Przykładem może być tutaj w pewnym przybliżeniu np. Słońce, które de facto przy ogromnych odłegłościach daje nam na ziemi promienie równoległe.

Przypatrzmy się rysunkom poniżej. Przedstawiają one dwa scenariusze sceny, dla powyższych rodzajów świateł. Jedna pokazuje sytuację, gdy mamy do czynienia ze światłem punktowym a druga z takim, które symuluje np. oświetlenie słoneczne - czyli padające promienie światła są równoległe.

Jak widać, różnica pomiędzy cieniami pochodzącymi od dwóch różnych rodzajów światła będzie dosyć znaczna. Cień pochodzący od światła punktowego będzie z reguły większy, z tendencją do rozrastania się w miarę zmniejszania się odległości pomiędzy światłem a obiektem, da się zaobserwować ponadto charakterystyczne zniekształcenie spłaszczonego obiektu. Natomiast cień pochodzący od słońca będzie niewrażliwy na ruchy światła na linii obiekt-światło, będzie trochę mniej zniekształcony i bardziej chyba będzie przypominał sam obiekt spłaszczany. Przy zastosowaniu przedstawionych metod w tym artykule dostaniemy do ręki jeszcze jedną ważną rzeczy, jeśli chodzi o cienie - otóż będą się one mogły poruszać zarówno pod wpływem ruchu obiektów jak i świateł. Ma to niebagatelne znaczenie, bo tak po prawdzie to nieruchomy cień swoje robi, ale cienie dynamiczne to jest dopiero coś i robią ogromne wrażenie na widzu (kto grał w najnowsze produkcje ten wie :). Skoro wiemy już o czym mowa, znamy przypadki jakie mogą wystąpić podczas naszych obliczeń to możemy przystąpić do omawiania aparatu matematycznego, który posłuży do wygenerowania cienia na płaszczyźnie. Chociaż przedstawione powyżej przypadki będą się różnić nieco w szczegółach implementacji to istnieje pewna, podstawowa część wspólna, bez której nie ruszymy dalej. Czas więc się dowiedzieć jak spowodować to, aby wierzchołek powędrował nam na podłogę. Odpowiedź jest wbrew pozorom bardzo prosta i stosuje się tę metodę już od lat. Otóż wystarczy zrzutować dany wierzchołek bryły na daną płaszczyznę wzdłuż prostej łączącej źródło światła i ten właśnie wierzchołek. W miejscu, gdzie przecinają się płaszczyzna i ta prosta będziemy mieli szukany rzut naszego wierzchołka cienia. Jeśli brzmi to trochę skomplikowanie przyjrzyjmy się poniższemu rysuneczkowi:

Punkt czerwony to wierzchołek rzutowany na podłogę. Oczywiście, aby uzyskać poprawny cień, w tym momencie musi on już być przekształcony przez macierz świata, aby obiekt znalazł się we właściwym położeniu na scenie względem światła. Punkt żółty to miejsce położenia źródła światła, które oczywiście także może się zmieniać w czasie. Czarny punkt S to nasz szukany, zrzutowany na płaszczyznę podłogi P wierzchołek. Aby znaleźć położenie tego punktu wystarczy rozwiązać prosty układ równań, w którym jeden wzór to równanie prostej L przechodzącej przez źródło światła i rzutowany wierzchołek a drugi to równanie płaszczyzny P. Stosując znane metody ze szkoły chyba podstawowej jesteśmy w stanie tego na pewno dokonać, jeśli uczyliśmy się pilnie :D. Ale w grafice zawsze nas interesuje szybkość i tutaj od razu nasuwa się pytanie. Czy musimy rozwiązywać aż układ równań, żeby się dowiedzieć gdzie położony będzie zrzutowany punkt? Z lekcji matematyki wiemy, że na pewno nie jest to ani proste a tym bardziej szybkie - przynajmniej przy zastosowaniu powszechnie dostępnych metod. Byłbym na pewno wrednym kłamcą, gdybym powiedział, że nie istnieje inna droga, ale chcąc sobie nieco ułatwić sprawę trzeba troszeczkę inaczej podejść do sprawy. Jeszcze nie mieliśmy w naszym dziale o matematyce omówionych pewnych fajnych spraw dotyczących wszystkich potrzebnych przekształceń i sztuczek, więc niektórzy, mniej doświadczeni mogą się poczuć w tym momencie nieco zagubieni. Ale nie musicie znać dogłębnie teorii (którą sobie na pewno kiedyś omówimy), wystarczy aby znać pewien fajny wzór. Ale może od początku - aby nieco łatwiej obliczyć sobie przecięcie prostej z płaszczyzną wprowadzimy dzisiaj tzw. równanie parametryczne prostej. Co to za diabeł jest? Ano, wszyscy zapewne znamy ze szkoły najpopularniejszy sposób zapisu równania prostej w postaci funkcji:

gdzie a to tzw. współczynnik nachylenia a b to przesunięcie wykresu w układzie współrzędncyh. Równanie parametryczne to nic innego, tylko inny sposób zapisu takiej samej funkcji, tylko, że za pomocą innych parametrów:

gdzie s jest naszym tajemniczym parametrem, a P0 i P1 są punktami położonymi na prostej. Działanie równania parametrycznego powinno być nawet dla nie znających go, dosyć zrozumiałe. No bo cóż tutaj widzimy? Ano P(s) jest to nic innego, jak tylko jakiś nowy punkt na prostej, położony w zależności od parametru s. Jak jest wyliczany? Pomiędzy dwoma punktami na prostej da się na pewno stworzyć wektor (odejmując współrzędne punktów). Następnie mnożąc ten wektor przez jakąś wartość (s!) i dodając do któregoś punktu otrzymamy co? Ano, jakiś inny punkt oddalony od danego o dany wektor·s. Poniższy rysuneczek powinien nieco rozjaśnic sytuację:

Oczywistym jest więc, że zmieniając s możemy się poruszać po całej prostej. I teraz pozostaje tylko pytanie, jak dobrać to s, żeby punkt na prostej leżał dokładnie na przecięciu się z płaszczyzną (zakładając, że tak właśnie się dzieje, bo wiemy także, że czasem dowcipnie prosta może leżeć równolegle do płaszczyzny. Spójrzmy na nasz rysunek. Weźmy sobie jakiś punkt na prostej nie leżący na płaszczyźnie, ale nie będący jednocześnie żadnym z danych punktów prostej (P0, P1) - niech to będzie dla przykładu P(s)): Wektor P(s)-O powstanie poprzez dodanie wektorów W i s·U (a s·U to nic innego jak kombinacja P(s)-P0):

Zauważmy, że w punkcie P(s1) normalna płaszczyzny jest prostopadła do wektora łączącego punkt P(s1) z O. Ten ostatni wektor, podobnie jak powyżej będzie wynosił:

czyli po skróceniu i uproszczeniu:

Wektor P(s1)-O jest prostopadły do wektora normalnego płaszczyzny a z tego z kolei wynika, że iloczyn skalarny tych dwóch wektorów będzie wynosił 0. Mając tę wiedzę, możemy napisać:

czyli:

Rozwiązując to równanie ze względu na współczynnik s, znajdziemy to, czego szukamy, czyli jaką wartość powinien mieć parametr s, aby punkt wyliczony z równania parametrycznego leżał na przecięciu prostej opisanej równaniem parametrycznym i płaszczyzny opisanej normalnym równaniem. Koniec końców otrzymamy:

Wystarczy potem tylko w programie wyliczającym rzutowaną wartość wstawić za s wartość wyliczoną z tego wzoru do wzoru poniżej, który zresztą już znamy. Za P0 położenie źródła światła a za P1 wierzchołek, który został umieszczony we właściwym miejscu sceny (jest przetransformowany przez macierz świata).

Jak widać, takie przekształcenia to aż się proszą, aby jest wstawić do shadera, bo w wielu miejscach niemal narzucają się niektóre rozkazy - widać to nawet bez dokładniejszej analizy. I na pewno, w praktycznych przykładach napiszemy sobie odpowiednie shakery, które będą rzutowały wierzchołki na płaszczyzny.

Powracając do początków naszej lekcji, powiedzieliśmy sobie, że zastosujemy dwie bardzo podobne metody a jednak nieco różne. Różnica w obliczeniach będzie naprawdę minimalna, ale żeby sobie nie zaciemniać napiszemy dwa oddzielne rzutowania, żeby się nauczyć a potem będzie można kombinować. Weźmy dla przykładu przypadek pierwszy, czyli światło słoneczne, gdzie promienie teoretycznie padają równolegle:

Zgodnie z naszymi rozważaniami teoretycznymi, w przypadku każdego wierzchołka naszej bryły trzeba będzie wyliczyć wektor od wierzchołka do światła a następnie wyliczony z równania parametrycznego stworzy cień na podłodze. Z tym, że musimy tutaj zwrócić uwagę na pewną niedogodność. Mianowicie liczenie tego nieszczęsnego wektora. Jeśli wyliczymy to tradycyjnie, czyli odejmując od wierzchołka położenie źródła światła to otrzymamy wiązkę wektorów, które wcale równoległe nie będą a po zrzutowaniu wzdłuż tych wektorów otrzymamy efekt dokładnie odwrotny do zamierzonego. Dlatego musimy tutaj dokonać pewnych kombinacji. Co łatwo da się zauważyć z faktu równoległości wektorów to to, że tak naprawdę to jest na potrzebny raptem tylko jeden wektor łączący wierzchołek ze światłem a on może być potem użyty do pozostałych obliczeń. Pozostaje tylko jakże istotne pytanie - którego wierzchołka należy użyć aby wyliczyć wektor kierunku światła i co za tym idzie i rzutowania? Jeśli nasza bryła będzie dosyć nieregularna i będzie na przykład bardzo wydłużona to mogą nastąpić spore zniekształcenia, jeśli wybierzemy jakiś wierzchołek w newralgicznym punkcie, położonym na jakiejś oddalonej krawędzi (cień może wystąpić w miejscu, gdzie tego nie oczekujemy). Dlatego też dobrym sposobem wydaje mi się będzie dokonanie pewnej prekalkulacji. Otóż wyliczymy sobie środek geometryczny naszej bryły zaraz na początku programu, który zapamiętamy na cały czas trwania animacji. W momencie, gdy będziemy potrzebowali użyć go do wyliczenia wektora kierunku po prostu przekształcimy go przez macierz świata (wymnożenie jednego wierzchołka przez jedną macierz kosztuje bardzo niewiele), następnie odejmiemy od niego położenie źródła światła (też znikoma obliczeniowo operacja) i już mamy to, co chcieliśmy - jeden wektor, którego możemy używać do rzutowania wszystkich wierzchołków bryły. I to powinno nam dać w miarę zadowalający efekt i cień w miarę poprawnie zrzutowany. Drugi przypadek, pomimo tego, że nie będziemy robić takich kombinacji paradoksalnie jest jednak trochę bardziej kosztowny obliczeniowo. Wektory rzutujące, wyliczone jako różnica pomiędzy przekształconym w świecie wierzchołkiem a źródłem światła będą musiały być obliczone dla każdego wierzchołka, co przy skomplikowanych bryłach może znacznie spowolnić obliczenia:

No ale i efekt otrzymany będzie chyba wart poświęcenia, bo otrzymamy cień dosyć realistyczny i taki, jak to wygląda w rzeczywistym świecie. Z każdą zmianą położenia źródła światła cień będzie podążał dynamicznie i efekty mogą być naprawdę niezłe. Myślę, że to wszystko jest w miarę proste i nieskomplikowane, bo metoda jest po prostu taka. Oczywiście za prostotą metody idą znaczne ograniczenia i niedogodności, które w większości przypadków będą nawet nie do przeskoczenia i trzeba będzie kombinować inaczej. No ale powiedzmy sobie o nich bo warto wiedzieć gdzie można ją zastosować a gdzie raczej się nie nadaje:
  • jak już powiedzieliśmy sobie to jest metoda dobra do rzucania cieni na płaskie powierzchnie a w zasadzie to na jedną. Oczywiście moglibyśmy zastosować tę metodę to rzucania cieni na bardziej skomplikowane zestawy powierzchni, ale to ciągnie ze sobą zbyt nadmierny wzrost obliczeń przekreślający w praktyce takie działania. Wyobraźmy sobie dla przykładu, że chcemy rzucić cień obiektu na fragment terenu przedstawiony na rysunku poniżej:

    Teren złożony jest z fragmentów płaszczyzn, które leżą zgodnie z ukształtowaniem terenu. Wprawdzie nasza metoda umożliwia zrzutowanie wierzchołków na dowolnie położoną płaszczyznę, no ale problem nie leży tutaj w rzutowaniu. Jak widzimy poszczególne fragmenty zrzutowanej bryły leżą na różnie położonych płaszczyznach. Problem, który się tutaj pojawia to wyliczenie, które wierzchołki mają się znaleźć na danym kawałku. Gdybyśmy dla każdej płaszczyzny, na którą jest rzutowany obiekt stosowali shader rzutujący to dostalibyśmy sporo duplikujących się wierzchołków, które powodowałyby zakłócenia. Trzebaby najpierw sprawdzać, na którą płaszczyznę dany wierzchołek pada i na tą go rzutować. Dodatkowo należałoby obcinać zrzutowaną geometrię za pomocą bufora szablonu do pasującego kawałka widocznej powierzchni a to też się wiąże z obliczeniami, bo bufor szablonu z reguły nie jest demonem szybkości nawet na współczesnych kartach.
  • następnym problemem jest położenie obiektu względem podłogi. Załóżmy następującą sytuację:

    Problem, który tutaj występuje to wierzchołki leżące poniżej poziomu podłogi. Jeśli naszą metodę zastosować tutaj bezkrytycznie to otrzymamy oczywisty błąd, ponieważ wierzchołki leżące poniżej poziomu podłogi zostaną również zrzutowane na podłogę i cień będzie wyglądał co najmniej dziwnie. Częściowym rozwiązaniem może być nie rzutowanie przetransformowanych wierzchołków leżących poniżej poziomu podłogi na samą podłogę, ale pozostawienie ich oryginalnych położeń. Wtedy, zrzutowany obiekt będzie poprawnie się wyświetlał jako cień na podłodze a wszystko, co jest poniżej zostanie tak, jak było. Wtedy poniżej podłogi będzie nam po prostu wystawał kawałek obiektu, który tak naprawdę powinien być cieniem. Pół biedy, jeśli mamy założenie, że nie widać nic pod podłogą - po prostu nie możemy tam zaglądać i koniec. Wtedy problemu nie ma. Ale jeśli można zaglądać pod podłogę to co? Wtedy pozostaje np. zastosować dostępne na dzisiejszym sprzęcie tzw. płaszczyzny obcinające (clipping planes), które skutecznie mogą ograniczyć wyświetlanie niektórych części niechcianej geometrii. No albo znaleźć jakieś inne alternatywne wyjście.
  • oczywiście, przy tej metodzie obiekty nie są w stanie w rozsządnym czasię w żaden sposób rzucać cieni na samych siebie, chyba, że są jakimiś ekstremalnie prostymi bryłami (no ale kogo takie bawią dzisiaj?). Nie możemy zapominać, że podobnie jak w przypadku terenu dużą pracę wykonałby tutaj bufor szablonu. W podobny sposób nie mogą rzucać cieni na inne obiekty, które są na scenie. Jeśli ktoś się uprze to to zrobi, no ale weźcie pod uwagę problemy z obcinaniem geomerii, podobnie jak w przypadku nierrównego terenu.
Czy więc ta metoda naprawdę do niczego się nie nadaje? Oczywiście nie. Na pewno można znaleźć całą gamę zastosowań, w których doskonale się sprawdzi. A dlaczego? Bo możemy stosując ją dopuścić się bardzo sprytnych oszustw, o których zwykły oglądacz naszego efektu nie będzie miał pojęcia. Powiedzmy sobie może o kilku, bo naprawdę warto je stosować:
  • Kiedy spłaszczamy obiekt dokonujemy zniekształcenia geometrii. To pociąga za sobą możliwość uproszczenia geometrii rzutowanej - nie musimy rzutować oryginalnego obiektu, który może być bardzo skomplikowany ale możemy go zastąpić uproszczonym modelem, który tylko odda jego przybliżone kształty.
  • Rzutowany obiekt nie musi zawierać wszystkich danych obiektu rzutowanego. Chodzi oczywiście o dane wierzchołków, które będą przepychane przez shader rzutujący. Cień z reguły jest czarny lub dość ciemny, nie zawiera na pewno żadnych tekstur. Tak więc do narysowania cienia wystarczą nam zaledwie współrzędne wierzchołków oraz kolor diffuse, który ustawimy w shaderze. To nic w porównaniu do tego, co zawiera wierzchołek przygotowany do mapowania wypukłości na przykład.
  • Możemy dokonać niekiedy pewnych prekalkulacji i optymalizacji, np. w przypadku światła kierunkowego wystarczy jeden wierzchołek w centrum obiektu aby wyliczać prostą rzutującą wszystkie pozostałe wierzchołki.
Reasumując: Metoda sprawdza się w większości przypadków, co zobaczymy na przykładowych programach w lekcjach praktycznych. Nie jest może jakaś super doskonała, ale można przy odrobinie starań naprawdę wyciągnąć z niej niezłe efekty. Mając w pamięci ograniczenia, jakie ze sobą niesie należy ją stosować tam, gdzie jest to możliwe i raczej nie istnieje prawdopodobieństwo, że sprawi jakieś problemy. Doskonale nadaje się do płaskich terenów czy dużych powierzchni (np. woda). Raczej nie sprawdzi się w pomieszczeniach zamkniętych, w których stoi dużo obiektów wpływających przede wszystkim na siebie nawazjem. Dobrym przykładem zastosowania może być na przykład tor wyścigowy dla samochodów. Jest reguły płaski, więc to, co nam trzeba, otoczenie też raczej się nie wybija więc z powodzeniem można spłaszczyć uproszczoną wersję samochodu i cieszyć oczy widokiem ;). W lekcjach praktycznych pokażemy sobie shadery rzutujące zarówno dla świateł punktowych jak i kierunkowych no i spróbujemy animować nasze obiekty, żeby sprawdzić czy nasze cienie są wystarczająco dynamiczne.


©Copyright by robal   



Tutoriale - Techniki
Nasze newsy s� w RSS: backend.php
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Tworzenie strony: 0.04 sekund

:: Layout strony został stworzony przez www.nukemods.com w oparciu o styl phpbb2 Helius, którego autorem jest Cyberalien ::