2013-04-04 21 views
19

Rozumiem różnicę między Lambertem i Phongiem w ogólnej grafice komputerowej. Rozumiem również, w jaki sposób możemy zmienić i tworzyć własne materiały za pomocą pliku three.js. Ale nie mogę znaleźć różnicy między MeshLambertMaterial i MeshPhongMaterial w ich domyślnych stanach.Three.js: Jaka jest dokładna różnica między Lambertem i Phongiem?

Próbowałem przełączać je na scenę z jednym kierunkowym źródłem światła i 125 sferami, nie widzę żadnych różnic. Three.js jest używany w rozdziale mojej książki, więc muszę się upewnić, że wszystkie informacje są dokładne i precyzyjne.

Dzięki, Shane

+3

Użyj szorstkiej siatki wielokątnej i źródła światła, które pozostawia tylko niewielką jasną plamę w środku wielokąta i powinieneś zauważyć różnicę! –

Odpowiedz

18

Zakładam, że chcesz dokładną różnicę między MeshLambertMaterial i MeshPhongMaterial, jak zaimplementowane w three.js.

Musisz rozróżnić model cieniowania od modelu oświetlenia. Three.js nie implementuje "czystych" modeli Phonga lub Lamberta.

W przypadku MeshLambertMaterial obliczenia natężenia oświetlenia są wykonywane dla każdego wierzchołka, a wynikowy kolor jest interpolowany na powierzchni wielokąta. (Cieniowanie Gourauda (uogólniony) model oświetlenia Lambert)

Dla MeshPhongMaterial, normalne wierzchołki są interpolowane na powierzchni wielokąta, a obliczenia oświetlenia są wykonywane dla każdego teksela. (Zaciemnienie Phonga (uogólniony) Phongowy model oświetlenia)

Widać wyraźną różnicę, gdy masz światło punktowe zbliżone do twarzy - szczególnie, jeśli odległość tłumienia światła jest mniejsza niż odległość do wierzchołków twarzy.

Dla obu materiałów, w przypadku FlatShading, normalna twarz zastępuje każdy wierzchołek normalny.

three.js.r.66

18

Shane, to nie twoja wina, że ​​jesteś zdezorientowany.

Lambert to model oświetlenia (z fizyczną podstawą) dla światła odbijanego od powierzchni, wyrażonego w kategoriach kierunku napływającego światła w odniesieniu do powierzchni normalnej w punkcie padania.

Phong jest bardziej zniuansowanym modelem cieniowania (choć bardziej odrażającym), który mówi, że światło składa się z komponentów ambient + dyfuse + specular. Traktuje on komponent otoczenia jako stały wszędzie (hack!), Komponent rozproszony wykorzystujący powyższy model Lambertiana i element lustrzany wykorzystujący falloff mocy (który jest sprytnym hackerem, przybliżonym przybliżeniem rzeczywistych BRDF).

Słowo "Phong" jest również metodą interpolacji (jeśli jest używane w kontekście nowoczesnych potoków renderowania opartych na trójkątach). Przy obliczaniu oświetlenie na piksel we wnętrzu trójkąta, masz dwie możliwości:

  1. Gouraud cieniowania: Compute kolor na trzech wierzchołkach i interpolacji we wnętrzu, za pomocą barycentryczne współrzędne lub

  2. Cieniowanie Phong: używając normalnego w trzech wierzchołkach, interpoluj normalne we wnętrzu i oblicz cieniowanie przy użyciu tego interpolowanego normalnego dla każdego piksela.

To dlatego (jak @RayToal wskazał), jeśli lustrzane „highlight” spada we wnętrzu trójkąta, żaden z wierzchołków będzie jasne, ale cieniowanie Phong będzie interpolować normalne i nie będzie być jasnym punktem we wnętrzu wytopionego trójkąta.

2

Jeśli znasz trochę GLSL, myślę, że najlepszą rzeczą do zrobienia jest spojrzenie na shadery wierzchołków/fragmentów wygenerowane w obu przypadkach i poszukiwanie różnic. Możesz użyć http://benvanik.github.com/WebGL-Inspector/, aby uzyskać kod programów lub umieścić console.log() we właściwym miejscu w trzech źródłach js (poszukaj buildProgram, powinieneś wypuścić prefix_fragment + fragmentShader i prefix_vertex + vertexShader, aby zobaczyć kod programu).

Ponadto, można mieć wygląd bloków budowlanych wykorzystywanych do tworzenia zarówno shaderów:

Lambert: https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L2036 Phong: https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L2157

może być bardziej czytelny niż patrzeć na kod programu źródłowego.

3

W grafice komputerowej, to bardzo często mylić Phong odbicie modelu z Phong cieniowania. Podczas gdy pierwszy jest modelem lokalnego oświetlenia punktów takich jak Lambertian, późniejsza jest metoda interpolacji, jak cieniowanie Gouraud. W przypadku, gdy trudno jest je rozróżnić, poniżej znajduje się lista szczegółowych artykułów na każdy z tych tematów.