ďťż

gouard

Lemur zaprasza

Interpolacja -> zastosowanie w cieniowaniu Gourauda
Jest ˙to ˙nic ˙innego jak znajdowanie wartosci posrednich miedzy
dwiema wartosciami: x1 a xn.
Robimy to tak:
1. Liczymy
delta_x = xn - x1 / ilosc_krokow
2. I wykonujemy: x = x + delta_x "ilosc_krokow" razy(przy czym początkowa wartość x to x1)
Dzięki punktom 1 i 2 możemy przejść od wartości x1 do xn w "ilosc_krokow" krokach - i to jest właśnie interpolacja.
Algorytm ˙ten ˙wykorzystywany ˙jest ˙przy cieniowaniu algorytmem
Gouarda . Jesli mamy linie pozioma o kolorach i wspolrzednych:
x1->c1 i x2->c2 (Uwaga: x1 mniejsze od x2 inaczej zamien miejscami)
robimy:
delta_c = c2-c1/x2-x1
teraz dla kazdego piksela(dalej w prawo) poczynajac od x1 robimy
c=c+delta_c, przy czym jako poczatkowa wartosc c przyjmujemy c1.
Mamy ˙wtedy przejscie koloru c1 w c2 pomiedzy wspolrzednymi x1,y
a x2,y dla kazdej linii poziomej(y - to jej wysokosc).
Naszym ˙˙zadaniem ˙˙jest ˙˙napisac ˙procedure ˙ktora ˙bedzie ˙to
realizowala np.
linia(x1,cl,x2,cp,y);
gdzie: cl - kolor lewej strony linii, cp - prawej
Wykorzystamy ja do narysowania calego trojkata,jak ponizej

Teraz ˙zakladamy, ˙ze wiemy jak wyswietla sie trojkat i bedziemy
przesuwac sie od Y1 w dol(zal. Y1 mniejsze od Y2 mniejsze od Y3).
Nasz ˙problem polega na tym jak wyliczyc cl,cp dla kolejnych lin
trojkata.
ccl=c1;
ccp=c1;
delta_c1 = c2-c1/y2-y1;
delta_c2 = c3-c1/y3-y1;
od y=y1 do y2
{
linia(x1,ccL,x2,ccP,y);
ccl=ccl+delta_c1;
ccP=ccp+delta_c2;
y++;
}
ccl=c2;
delta_c1 = c3-c2/y3-y2;
od y=y2 do y3
{
linia(x1,ccL,x2,ccP,y);
ccl=ccl+delta_c1;
ccP=ccp+delta_c2;
y++;
}
W ˙algorytmie tym pominieto liczenie wspolrzednych X ktore liczy
sie ˙jak ˙dla ˙normalnego ˙algorytmu ˙na ˙kreslenie ˙trojkatow->
analogicznie jak C.

Opis powyzszego pseudokodu:
1. Na poczatku rysowany jest fragment

stad
kazdy kolor lewego konca kazdej linii liczymy ze wzoru:
ccl=ccl+delta_c1;
a prawego
ccP=ccp+delta_c2;
Natomiast delta_c1 i delta_c2 liczymy ze wzoru:
delta_c1 = c2-c1/y2-y1; -> obrazuje przejscie miedzy kolorami c1
a ˙c2 ˙(c1 ˙i c2 to lewa strona trojkata czyli delta_c1 jest dla
kolejnych lewych stron rysowanych lin trojkata)
delta_c2 = c3-c1/y3-y1; -> obrazuje przejscie miedzy kolorami c1
a ˙c3 ˙(prawa ˙strona ˙calego ˙trojkata, czyli dla prawej strony
wszystkich lin trojkata)

Po ˙dojsciu ˙y ˙do Y2 delta_c1 zmienia sie gdyz zaczynamy od tej
pory ˙rysowac ˙druga(dolna) polowke trojkata i trzeba uwzglednic
przejscie kolorow od c2 do c3(dla lewej strony).

2. Musimy od nowa policzyc delta_c1, wiec:
delta_c1 ˙= c3-c2/y3-y2; ->obrazuje przejscie miedzy kolorami c2
a ˙c3 ˙(c2 i c3 to lewa strona trojkata czyli delta_c1 jest dla
kolejnych lewych stron rysowanych lin trojkata)
A wiec teraz rysujemy framgment:

Tak otrzymujemy kompletnie ocieniowany trojkat.


Co to sa dokladnie te delta_c1 i delta_c2? Wystarczy spojrzec na
wczesniejszy opis algorytmu realizowanego przez procedure linia.
Sa ˙one odpowiednikiem delta_x, ale w pionie i dla dwoch roznych
stron trojkata: lewej i prawej. Przy czym:
delta_x ˙- ˙okresla ˙jak sie ma zmiana wartosci koloru do zmiany
wspolrzednej ˙˙poziomej(patrz ˙˙procedura ˙cieniowania ˙poziomej
linii)
delta_c ˙- ˙okresla ˙jak sie ma zmiana wartosci koloru do zmiany
wspolrzednej pionowej(procedura cieniowania calego trojkata)

Uwaga: ˙˙Nalezy ˙˙pamietac, ˙˙ze ˙dla ˙kazdego ˙trojkata ˙nalezy
przygotowac ˙odpowiednia ˙palete ˙ktora ˙potem nalezy nalozyc na
biezaca(np. ˙zorowac ˙z ˙odczytana ˙z ˙pamieci). ˙W ˙ten ˙sposob
bedziemy mogli jednoczesnie wyswietlic kilka roznie cieniowanych
trojkatow.
Autor: Piotr Sokołowski
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • teen-mushing.xlx.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © Lemur zaprasza