5. Cieniowanie siatek wielościanowych

5.2. Cieniowanie Gourada

Jeżeli zależy nam, by ukryć siatkową strukturę powierzchni, można zastosować prostą zasadę interpolowania jasności, znaną jako cieniowanie Gourauda (Rys. 37).

 

Rysunek 37. Cieniowanie Gourauda.

 

Obiekty wyglądają na gładkie, chociaż można zauważyć jasne, mało widoczne pręgi na stożku; są one pasmami Macha powodowanymi przez szybkie, chociaż nie nieciągłe zmiany nachylenia krzywej jasności.  cieniowanie Gourauda nie eliminuje więc całkowicie takich zmian jasności, ale wydatnie je zmniejsza. 

 

W procesie cieniowania wymagana jest znajomość normalnej dla każdego wierzchołka  siatki wielokątowej, które możemy obliczyć bezpośrednio z analitycznego opisu powierzchni. W przypadku, gdy normalne dla wierzchołków nie są zapisane z siatką i nie mogą być określone bezpośrednio dla bieżącej powierzchni, Gouraud zaproponował, aby je aproksymować na zasadzie uśredniania normalnych do powierzchni wszystkich ścian wielokątowych, dla których rozpatrywany  wierzchołek jest wspólny.

 

Rysunek 38. Uśredniona normalna Nv

 

Zatem uśredniona normalna Nv jest równa (dla przedstawionego przypadku):

 

{\mathbf{N}}=\frac{\mathbf{N}_\mathbf{1}+\mathbf{N}_\mathbf{2}+\mathbf{N}_\mathbf{3}+\mathbf{N}_\mathbf{4}}{\left|\mathbf{N}_\mathbf{1}+\mathbf{N}_\mathbf{2}+\mathbf{N}_\mathbf{3}+\mathbf{N}_\mathbf{4}\right|}

 

W kolejnym kroku cieniowania Gourauda należy znaleźć jasności w wierzchołkach wykorzystując do tego normalne w wierzchołkach za pomocą wybranego modelu oświetlenia. Ostatecznie każdy wielokąt jest cieniowany na zasadzie interpolacji liniowej między wierzchołkami wzdłuż każdej krawędzi, a następnie między krawędziami wzdłuż każdego przeglądanego wiersza,  w taki sam sposób jak przy interpolowaniu wartości w algorytmie z z-buforem. 

 

Rysunek 39. Interpolowanie jasności wzdłuż krawędzi wielokąta i przeglądanych wierszy.

Poszczególne jasności wyznacza się za pomocą równań:

I_a=I_1-(I_1-I_2)\frac{y_1-y_s}{y_1-y_2}

I_b=I_1-(I_1-I_3)\frac{y_1-y_s}{y_1-y_3}

I_p=I_b-(I_b-I_a)\frac{x_b-x_p}{x_b-x_a}