home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
07
/
ami24
< prev
next >
Wrap
Text File
|
1997-04-15
|
9KB
|
196 lines
Jak ulepszyê procedurë?
-----------------------
CIENIOWANIE: PROSTE METODY
<lead>Dzisiaj, zgodnie z tytuîem odcinka, zajmiemy sië metodami
cieniowania grafiki wektorowej. Temat ten postanowiîem rozbiê na
dwie czëôci. Teraz wiëc omówië tylko mniej skomplikowane
oôwietlanie prostych bryî oraz rozkîadanie sië ôwiatîa na
nieruchomych obiektach, by dopiero za miesiâc poîâczyê wszystko w
caîoôê. Oprócz tego, zgodnie z obietnicâ, na poczâtku dodajë parë
sîów na temat fraktalowych krajobrazów.
<a>Miklesz/Damage
<txt>W poprzednim artykule wspomniaîem o moûliwoôci wykonania
bocznych przechyîów kamery podczas lotu nad górami. Od razu
zaznaczam, ûe metoda, którâ podam, pozwala jedynie na uzyskanie
niewielkiego odchylenia od pionu, gdyû nie opiera sië na
rotowaniu caîego obrazu (co spowolniîoby naszâ procedurë), lecz
na pewnej sztuczce.
Wyobraúmy sobie, ûe mamy juû wygenerowany krajobraz, który skîada
sië (na przykîad) z 160 punktów w osi X i 128 w Y. Teraz, aby
uzyskaê efekt pseudoprzechyîu, zaczynamy powoli przesuwaê pionowe
paski tak, ûe te, leûâce z lewej, powëdrujâ o np. 10 punktów w
gorë, ôrodkowe nie zmieniâ wîaôciwie swojego poîoûenia, a
mieszczâce sië przy prawej krawëdzi ekranu przesunâ sië o 10
punktów w dóî.
Co otrzymamy? Z prostokâta powstanie równolegîobok, którego dwa
boki sâ pionowe, natomiast dwa kolejne, lekko przekrzywione w
stosunku osi X. Kiedy zdamy sobie sprawë, ûe figurë të wypeînia
obraz, uôwiadomimy sobie, ûe sprawiaê on moûe wraûenie lekko
obróconego w osi X. Sztuczkë të zastosowaîem w demie "Noxzema" i,
jak sîyszaîem, niewiele osób sië zorientowaîo, ûe przechyîy sâ
oszukiwane, a wiëc sië opîaca. Musimy jedynie zdaê sobie sprawë z
tego, ûe im bardziej rozciâgamy nasz obraz, tym bardziej jest on
deformowany!
Teraz jeszcze przepis na ruchome chmury. Co bëdzie nam potrzebne?
Obraz chmur o rozmiarach równych rozmiarom mapy (np. 512 x 512
pikseli) i trochë kodu. A jak to wykonaê? Otóû, nim narysujemy
nasz krajobraz, korzystajâc z tablicy perspektywy X-Z, zaczynamy
wypeîniaê chmurami górnâ poîówkë ekranu. Po prostu traktujemy
obîoki jako "równinë" (zawsze o zerowej wysokoôci, która jednak
nanoszona od góry, stworzy "sufit"). W ramach optymalizacji
polecam przygotowaê specjalnâ, odrëbnâ, tablicë dla chmur, która
pozwoli nam przyspieszyê rysowanie.
<sr>Patterny
<txt>Nareszcie mogë przejôê do tematu dnia, czyli cieniowania.
Proponujë omówiê tu poszczególne metody, opierajâc sië na
konkretnych przykîadach z dem. Na poczâtek cieniowanie
"bezczasowe", to znaczy opierajâce sië jedynie na umiejëtnym
podîoûeniu "patternu" z rozkîadem ôwiatîa. Przypatrzcie sië
obiektowi numer 1. Pochodzi on z dema "Nexus 7" grupy Andromeda.
Zastosowano tutaj bardzo starâ, choê wciâû efektownâ technikë
podkîadania 'patternu" z oôwietleniem. Metoda ta jest
nastëpujâca. Najpierw narysowano zwykîym programem graficznym
rozkîad ôwiatîa, jaki powstaîby na sferze. "Ûarówka" zostaîa
nieznacznie przesuniëta w stronë prawego górnego rogu. Z tak
narysowanego patternu, korzystajâc z moûliwoôci operowania na
osobnych mapach bitowych, wycinane sâ tylko te fragmenty, w
których wystëpujâ wektorowe "równoleûniki". Trzeba tutaj
zauwaûyê, ûe wszystkie te operacje nie zabierajâ nam cennego
czasu ekranowego, gdyû przeprowadzane sâ jedynie poprzez operacje
na bitach obrazu (które sâ dokonywane juû hardware'owo) oraz
odpowiednie ustawianie palety. Jedynym powaûnym obciâûeniem
procesora i innych ukîadów specjalizowanych Amigi, jest rysowanie
kolejnych klatek wektorówki (co jednak nie powinno nam zajâê
wiëcej niû 1 ramkë). Aby dokîadniej zrozumieê operacje, jakie sâ
przeprowadzane przy îâczeniu patternu z obiektem, radzë sobie
stworzyê (choêby na kartce) schematycznâ tablicë map bitowych.
Wtedy wszystko wyglâda znacznie przejrzyôciej. Nie podajë tutaj
gotowego przepisu, gdyû w zaleûnoôci od tego, ile kolorów liczyê
sobie bëdzie pattern, wektor i ewentualnie (ruchome bâdú to
statyczne) podkîady, sytuacja bëdzie sië zmieniaê.
<sr>Fade na Copperze
<txt>Teraz spójrzcie, proszë, na obrazek numer 2. Cieniowany,
dziurawy szeôcianik pochodzi z dema "Noxzema" grupy Damage.
Zastosowaîem tu jednâ z najprostszych chyba technik cieniowania.
Zauwaûmy, ûe kiedy obiekt obraca sië jedynie w osi Y, to bardzo
efektowny rozkîad ôwiatîa na górnej i dolnej ôciance moûemy
uzyskaê, poprzez zmienianie (za pomocâ Coppera) co jednâ
linië----------------?------------------- ekranu, koloru, jakim
jest wypeîniony face. Dwudziestoczterobitowa paleta pozwoli
uzyskaê elegancki cieï na "podîodze" i "suficie", który nie
zabiera nam cennego czasu ekranowego!
<sr>Cieniowanie nieruchomych obiektów
<txt>Wyobraúmy sobie, ûe chcemy oôwietliê nieruchomy obiekt.
Jedynie "ûarówka" bëdzie zmieniaê swoje poîoûenie. W tym celu
musimy wygenerowaê sobie (za pomocâ programu do raytracingu)
naszâ figurë w taki sposób, aby punkty coraz bardziej oddalone od
obserwatora stawaîy sië coraz ciemniejsze. Jak to zrobiê? To juû
nie moja dziaîka, musicie trochë pomëczyê swojego grafika 3D.
Zastanówmy sië, jakâ interpretacjë ma nasz wygenerowany obiekt.
Otóû moûemy uznaê, ûe jest to pîaskorzeúba, której punkty
najbliûsze kamery majâ kolor 255, a najdalsze 001. Dlaczego 001,
a nie 000? Poniewaû za punkt o kolorze 000 uznawaê bëdziemy punkt
oddalony od obserwatora o odlegîoôê plus nieskoïczonoôê. Takie
uproszczenie pozwoli nam uniknâê obliczania, i tak zawsze
wygaszonych, punktów tîa obiektu. Oczywiôcie, jeûeli nasza figura
pokrywa w caîoôci powierzchnië ekranu, musimy rozpatrywaê punkty
000 jako miejsca oddalone o skoïczonâ odlegîoôê. Przykîadowe,
wygenerowane w podany przeze mnie sposób, obiekty znajdziecie na
obrazkach numer 3 i 5. Kiedy mamy juû dane wejôciowe, czas
przystâpiê do oôwietlania. Jako natëûenie ôwiatîa w punkcie
przyjmiemy odlegîoôê od "ûarówki". Wynosi ona (z trójwymiarowego
Równania Pitagorasa):
<l>D=(X^2+Y^2+Z^2)^(1/2)
<txt>Îatwo moûna zauwaûyê, ûe w wypadku obrazka o rozmiarach np.
128 x 128 x 128 (ta trzecia wartoôê to oczywiôcie "gîëbokoôê")
maksymalnâ odlegîoôciâ jest D=221.7025 (w przybliûeniu D=222).
Naleûy wiëc tak dobraê ustawienie jasnoôci punktów, aby przy D=0
byîa ona najwiëksza i malaîa wraz z tym, jak sië oddalamy. W
praktyce okazuje sië, ûe bardziej efektowne jest caîkowite
wygaszenie juû w poîowie maksymalnej odlegîoôci, czyli dla
D=110.85125 (W przybliûeniu D=111). Dalej rysujemy juû jedynie
czarne (ew. bardzo ciemne) punkty. Jak wiëc bëdzie wyglâdaî peîny
algorytm? Pierwszâ rzeczâ, jakâ musimy zrobiê, jest...
przygotowanie paru tablic! Zaczynamy od przetablicowania
wszystkich, jaôniejszych od 000, punktów obrazka. Dla kaûdego z
nich zapisujemy koordynaty X, Y, oraz Z^2 (tak, tak, podnosimy Z
do kwadratu). Warto teû sobie zapisaê, ile punktów
przetablicowaliômy, gdyû tyle samo trzeba bëdzie póúniej
narysowaê. Drugâ tablicâ jest zestawienie wszystkich potëg liczb
od -128 do +128. Oprócz tego musimy sobie przeliczyê pierwiastki
wszystkich liczb od 0 do (128^2) x 3.
Drobna uwaga, warto juû wyliczone pierwiastki, przemnoûyê przez
wspóîczynnik zwiëkszajâcy lub zmniejszajâcy zasiëg rozkîadu
ôwiatîa na powierzchni obiektu. Oznacza to, ûe jeôli chcemy
uzyskaê caîkowite wygaszenie w odlegîoôci D=111, a mamy do
dyspozycji 16 odcieni, to na kaûdy jeden, przypadaê bëdzie mniej
wiëcej siedem kolejnych wartoôci D, co musimy uwzglëdniê przy
sporzâdzaniu tablicy. Kiedy juû jesteômy przygotowani, zaczynamy
rysowaê obiekt. Ustalamy X i Y úródîa ôwiatîa. Nastëpnie
obliczamy odlegîoôê w obu osiach od kaûdego z punktów. Dla
uproszczenia zakîadamy, ûe "ûarówka" porusza sië tuû nad
obiektem, czyli odlegîoôê "w gîâb" wynosi zawsze Z. Z
matematycznego punktu widzenia:
<l>D=((Xp-Xû)^2+(Yp-Yû)^2+(Zp-Zû)^2)^(1/2)
<txt>A poniewaû:
<l>Zû=0
<txt>to:
<l>D=((Xp-Xû)^2+(Yp-Yû)^2+(Zp)^2)^(1/2)
<txt>Dla wyjaônienia: indeks "û" to ûarówka, a "p" to punkt.
Przypominam, ûe zarówno podnoszenie do kwadratu, jak i
pierwiastkowanie rozwiâzujemy za pomocâ tablic. Pozostaje nam
teraz jedynie zapisaê wyliczony punkt i zabraê sië do nastëpnego.
W wypadku, kiedy chcemy uzyskaê dwa úródîa ôwiatîa, moûemy na
ekranie 256-kolorowym, dolne 4 bity koloru przeznaczyê na
pierwszâ "ûarówkë", a górne 4, na drugâ.
<sr>Ilustracje
<txt>Pozostaîo mi chyba jedynie omówiê pozostaîe ilustracje. To,
co widzicie pod numerkiem 3, to obiekt przykîadowy: "Lamp"
autorstwa Bednara z grupy Damage, przedstawiony w formie "im
jaôniejszy punkt, tym bliûej". Na podstawie tak wygenerowanego
obrazka, po oôwietleniu dwoma úródîami ôwiatîa, moûemy otrzymaê
efekt widoczny na ilustracji nr 4 (dla niedowiarków: to, co
widzicie, jest zgranym ekranem dziaîajâcego kodu...). Podobnie ma
sië sprawa z obrazkiem piâtym i szóstym. Mam nadziejë, ûe Kefir z
grupy Public Image Limited Of Union (koder dema "Zoombie") nie
obrazi sië na mnie za wykorzystanie w tym artykule jego danych
úródîowych (obiektu "Porshe"). Ostatna ilustracja to obiekt,
pochodzâcy z dema "Psychedelic" grupy Virtual Dreams Of
FairLight. Nie jestem w stanie w stu procentach stwierdziê, czy
oôwietlenie zostaîo wykonane przedstawionym przeze mnie
algorytmem "but it looks familiar..."
<sr>Sîowo na niedzielë
<txt>W nastëpnym odcinku, jak juû wspominaîem, zajmiemy sië
bardziej wyrafinowanymi metodami oôwietlania i cieniowania. Do
zobaczenia... Úle... Do usîyszenia... Teû nie... Do
"przeczytania" za miesiâc!