Odcień Phonga
Termin cieniowanie Phonga odnosi się zarówno do modelu oświetlenia Phonga, jak i interpolacji Phonga , dwóch algorytmów przetwarzania 3D w grafice komputerowej . Oba zostały opracowane przez Bui Tuong Phong i opublikowane w 1973 roku.
Model oświecenia Phong
Opis modelu
Iluminacja Phonga jest modelem lokalnym, to znaczy, że obliczenia są wykonywane w każdym punkcie. Ten model empiryczny nie jest dokładny, ale umożliwia wiarygodne obliczenie światła odbitego przez badany punkt, w tym celu łączy w sobie trzy elementy: światło otoczenia, światło rozproszone ( model Lambertian ) i światło zwierciadlane (patrz Odbicie optyczne ).
Celem jest obliczenie natężenia światła, które zostanie wyemitowane w wyniku odbicia przez badany punkt, oświetlony rzekomo punktowym źródłem, w precyzyjnym kierunku (kierunku obserwatora). W tym celu światło dzieli się na trzy elementy:
- Składnik otoczenia reprezentuje pasożyty pochodzące z czegoś innego niż rozważane źródło, na przykład światło odbite przez inne punkty. Zakłada się, że światło otoczenia jest równe we wszystkich punktach przestrzeni;
- Padające światło odbija się we wszystkich kierunkach. Składnik rozproszony oznacza intensywność, która rozpoczyna się ponownie z uwzględnieniem nachylenia z którego padające światło pojawia się na powierzchni, ale przy założeniu, że wielkość jest taka sama niezależnie od obranej przez odbicie promienia;
- Mimo wszystko więcej światła powraca w kierunku odbicia geometrycznego (tego, w którym promień wyszedłby po najechaniu na lustro). Rolą składnika zwierciadlanego jest uwzględnienie tego.
Ustawienia
- Dla każdego materiału zdefiniowano stałe charakterystyczne:
-
kw∈[0,1]{\ displaystyle k_ {a} \ w [0,1]} : stała powiązana z komponentem otoczenia, proporcja światła zwrotnego;
-
kre∈[0,1]{\ displaystyle k_ {d} \ w [0,1]} : stała związana ze składową rozproszoną;
-
ks∈[0,1]{\ displaystyle k_ {s} \ w [0,1]} : stała połączona ze składnikiem zwierciadlanym;
-
α»1{\ styl wyświetlania \ alfa \ gg 1} : stały związany z połyskiem materiału: im większy , tym jaśniejsza powierzchnia. Ta stała może przyjmować wysokie wartości : 10, 100 lub więcej.α{\ styl wyświetlania \ alfa}
(Pokazane wartości to tylko rząd wielkości.)
- Nazywamy , a natężenie padających świateł otoczenia, rozproszone i zwierciadlane. , , I odbita intensywność będąca sumą.jaw{\ styl wyświetlania i_ {a}}jare{\ styl wyświetlania i_ {d}}jas{\ styl wyświetlania i_ {s}}jaw{\ styl wyświetlania I_ {a}}jare{\ styl wyświetlania I_ {d}}jas{\ styl wyświetlania I_ {s}}ja{\ styl wyświetlania I}ja{\ styl wyświetlania I}
- Definiowane są następujące wektory: dla światła, dla normalnej do powierzchni, dla kierunku patrzenia obserwatora oraz dla kierunku, w którym światło będzie odbijane od lustra. wynika z relacji .L→{\ styl wyświetlania {\ vec {L}}}NIE→{\ styl wyświetlania {\ vec {N}}}V→{\ displaystyle {\ vec {V}}}R→{\ displaystyle {\ vec {R}}}
R→{\ displaystyle {\ vec {R}}}R→=2(NIE→⋅L→)NIE→-L→=2sałataθNIE→-L→{\ displaystyle {\ vec {R}} = 2 ({\ vec {N}} \ cdot {\ vec {L}}) {\ vec {N}} - {\ vec {L}} = 2 \ cos \ theta {\ vec {N}} - {\ vec {L}}}
Wszystkie te wektory muszą być znormalizowane tak, aby iloczyny skalarne dawały po prostu cosinus kąta między wektorami.
Formuły
Składnik otoczenia jest po prostu podany przez:
jaw{\ styl wyświetlania I_ {a}}
jaw=jaw.kw{\ styl wyświetlania I_ {a} = i_ {a} .k_ {a}}Składnik rozproszony wyrażony jest wzorem:
jare{\ styl wyświetlania I_ {d}}
jare=jarekre(L→⋅NIE→)=jarekresałataθ{\ displaystyle I_ {d} = i_ {d} k_ {d} ({\ vec {L}} \ cdot {\ vec {N}}) = i_ {d} k_ {d} \ cos \ teta}
W ten sam sposób, w jaki Słońce nagrzewa się bardziej w zenicie, jest maksimum, gdy światło dociera do powierzchni w normalnym kierunku, to znaczy
jare{\ styl wyświetlania I_ {d}}L→=NIE→{\ displaystyle {\ vec {L}} = {\ vec {N}}}
Składnik zwierciadlany jest wyrażony przez:
jas{\ styl wyświetlania I_ {s}}
jas=jasks(R→⋅V→)α=jaskssałataαΩ{\ displaystyle I_ {s} = i_ {s} k_ {s} ({\ vec {R}} \ cdot {\ vec {V}}) ^ {\ alfa} = i_ {s} k_ {s} \ cos ^ {\ alfa} \ Omega}
Jeśli , to maksimum. Im większe, tym mniejsze plamki świetlne.
V→=R→{\ displaystyle {\ vec {V}} = {\ vec {R}}}jas{\ styl wyświetlania I_ {s}}α{\ styl wyświetlania \ alfa}
Całkowita intensywność odbita wynosi zatem:
ja=jaw+jare+jas{\ styl wyświetlania I = I_ {a} + I_ {d} + I_ {s}}Dla kilku źródeł światła otrzymujemy jako pełną formułę:
ja=jawkw+Σnie∈{sotyrvsmis}(jare,niekre(L→nie⋅NIE→)+jas,nieks(R→nie⋅V→)α){\ displaystyle I = i_ {a} k_ {a} + \ suma _ {n \ in \ {źródła \}} {\ Big (} i_ {d, n} k_ {d} ({\ vec {L}} _ {n} \ cdot {\ vec {N}}) + i_ {s, n} k_ {s} ({\ vec {R}} _ {n} \ cdot {\ vec {V}}) ^ {\ alfa} {\ duży)}}
Aplikacja do grafiki komputerowej
Gdy chcemy zastosować ten algorytm w grafice komputerowej, oddzielamy składowe czerwony/zielony/niebieski koloru tekstury dla rozważanego punktu. Następnie stosujemy wzór na składniki otoczenia i rozproszone.
jaw=jare=jatmixttyrmi{\ displaystyle i_ {a} = i_ {d} = i_ {tekstura}}
Wady modelu Phong
Składnik zwierciadlany opiera się na dwóch wektorach kierunkowych, obserwatorze i świetle, i zabrania jakiejkolwiek radiosyczności modelu. Model ten ma charakter empiryczny i nie opiera się na żadnej teorii fizycznej, a jedynie na obserwacjach Phonga. Model ten nie zapewnia dyfuzji światła wraz z odległością.
Interpolacja Phong
Ta metoda, w porównaniu z interpolacją Gourauda , daje dobre wyniki renderowania, często bardziej realistyczne niż jej poprzedniczka.
Główny problem z cieniowaniem Gourauda polega na tym, że oblicza tylko wierzchołki wielokątów: zwierciadlane źródło światła umieszczone w środku trójkąta nie pojawi się. Ten problem został rozwiązany dzięki interpolacji Phonga.
Należy zauważyć, że w trójkącie trzy wierzchołki mają tę samą normalną, a także w dowolnym punkcie trójkąta. Aby uzyskać płynniejsze renderowanie, normalną każdego wierzchołka trójkąta można obliczyć, uśredniając wszystkie powierzchnie przy użyciu tego wierzchołka. Następnie otrzymujemy trzy normalne, które mogą się różnić.
Rozważ trzy różne wierzchołki: v 1 , v 2 i v 3 , mające jako normalne wektory jednostkowe n 1 , n 2 i n 3 . Co do interpolacji Gourauda, jest to wykonywane liniowo na całej powierzchni trójkąta , tylko z trzech wektorów normalnych wierzchołków, co oznacza, że w rzeczywistości interpolujemy wektory normalne zamiast kolorów.
v1v2v3{\ styl wyświetlania v_ {1} v_ {2} v_ {3}}
Jednak w przeciwieństwie do interpolacji Gourauda, obliczenia nie są wykonywane na trzech punktach na powierzchnię, ale na wszystkich punktach powierzchni - lub bardziej rozsądnie, na kilku podpodziałach punktów. Ta znacznie wolniejsza metoda jest czasami obsługiwana bezpośrednio przez sprzęt za pomocą shaderów .
Zobacz również
Bibliografia
<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">