Mapy Normalne kontra Normalne


17

Korzystam z importera zasobów Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) do analizowania modeli 3d.

Do tej pory po prostu wyciągnąłem normalne wektory, które są zdefiniowane dla każdego wierzchołka w moich oczkach. Znalazłem też różne samouczki na normalnych mapach ...

Jak rozumiem dla normalnych map, normalne wektory są przechowywane w każdym tekselu normalnej mapy, a ty wyciągasz je z normalnej tekstury w module cieniującym.

Dlaczego istnieją dwa sposoby uzyskania normalnych, które uważa się za najlepszą praktykę i dlaczego?

Odpowiedzi:


31

Krótka odpowiedź

Normalne mapy i Normalne to dwie różne rzeczy: Normalne są geometryczną właściwością dowolnej siatki / powierzchni, której użycie nie jest wyłączne do obliczeń zacienienia i oświetlenia, ale ma wiele innych zastosowań, na przykład w fizyce. Normalne mapy to tekstury, które kodują alternatywne wektory normalne używane w grafice komputerowej do symulacji nierówności.

Długa odpowiedź

Normalne w geometrii normalne to wektor lub linia, która jest prostopadła do danego obiektu (np. Normalna płaszczyzna, normalna wierzchołek). Normalne w grafice są zwykle używane do obliczeń światła, takich jak obliczanie rozproszonego odbicia na powierzchni, biorąc iloczyn punktowy między kierunkiem światła a normalnymi powierzchniami. Normalne są zwykle obliczane na podstawie właściwości geometrycznych siatki (Ściany / Wierzchołki), biorąc iloczyn poprzeczny dowolnych dwóch nierównoległych krawędzi, które leżą na tej samej płaszczyźnie.

W OpenGL normalne są określane dla wierzchołka (stąd nazywane atrybutami wierzchołków), nawet jeśli mogą być obliczane tylko dla każdej powierzchni, w tym przypadku musisz określić tę samą normę dla każdego wierzchołka w twarzy. Normalne mogą być interpolowane przez OpenGL na każdym wierzchołku twarzy (trójkąta), dzięki czemu można obliczyć odbite światło na piksel, a nie na wierzchołek, co daje dokładniejszy wynik.

Normalne mapowanie : z drugiej strony jest techniką w grafice komputerowej, która koduje Normalne na mapie tekstury, więc każda normalna jest kodowana na tekst. Zwykle służy do udawania oświetlenia guzów i wgnieceń (np. Mapowanie guzów, mapowanie paralaksy).

Ponieważ normalne są obliczane na podstawie właściwości geometrycznych siatki / powierzchni, mapy normalne podadzą alternatywne normalne, które mogą symulować nierówności w celu dodania szczegółów do powierzchni bez dodawania większej liczby wielokątów.

Zwykłe mapy są zwykle generowane przy użyciu znacznie bardziej szczegółowego modelu 3D, a następnie obliczane są normalne na podstawie tego modelu i kodowane na mapie normalnej.

Dlaczego potrzebujemy obu?

Mówiąc tylko o renderowaniu, normalne i normalne mapy są zwykle używane razem, aby osiągnąć ostateczny efekt świetlny, dobrym przykładem może być moduł cieniowania wypukłości, gdzie potrzebujesz normalnej mapy normalnej, aby uzyskać efekt oświetlenia wypukłości, a nadal będziesz potrzebować geometryczna normalna do obliczenia tak zwanej przestrzeni stycznej . Przestrzeń styczna jest zwykle używana, aby zapewnić możliwość ponownego użycia normalnych map.

Należy pamiętać, że normalna jest uważana za geometryczny atrybut powierzchni i ma o wiele więcej zastosowań niż tylko lekkie obliczenia. Z drugiej strony zwykłe mapy są zwykle używane do uzyskania powierzchownych efektów.

Rozszerzenie odpowiedzi w celu wyjaśnienia, dlaczego przestrzenie styczne są ważne:

Krótka odpowiedź: Przestrzenie styczne służą do uniezależnienia normalnych map od leżącej pod nimi geometrii.

[EDYCJA] Dodano obraz przedstawiający normalną mapę w przestrzeni stycznej i normalną mapę w przestrzeni świata.

wprowadź opis zdjęcia tutaj

Długa odpowiedź: poniższe zdjęcie pokazuje płaszczyznę UV i normalną, która definiuje przestrzeń styczną, podczas generowania normalnej mapy będziemy już wiedzieć, że używana przestrzeń zawsze będzie miała Normalną wskazującą w kierunku Z (dlatego normalne mapy wyglądają niebieskawo) , to pomoże nam zignorować krzywiznę powierzchni **,.

Przestrzeń styczna daje nam tę przewagę, że nasze normalne kodowanie map nie jest powiązane z określonymi normalnymi siatkami. Załóżmy, że zakodujemy naszą normalną mapę w przestrzeni świata lub obiektu, wtedy każda normalna, którą kodujemy, będzie miała kierunek oparty na tym, jak oryginalne normalne siatki różnią się w przestrzeni świata, nie wspominając już o tym, że transformacja modelu będzie miała wpływ na twoją normalną mapę.

wprowadź opis zdjęcia tutaj

Na powyższych dwóch obrazach widać dość wyraźnie, że przestrzeń stycznych sprawia, że ​​normalne mapy (po prawej) są niezależne od podstawowej geometrii, ponieważ wszystkie normalne są kodowane w prawie tym samym kierunku z niewielką zmiennością, aby symulować efekt wypukłości.

** krzywizna powierzchni jest zdefiniowana przez wielkość, którą obiekt geometryczny odbiega od bycia płaskim lub prostym w przypadku linii, ale jest to definiowane na różne sposoby w zależności od kontekstu.

Reprezentacja przestrzeni stycznej


1
Jeśli znajdziesz obraz przedstawiający, w jaki sposób sama normalna tekstura nie może być konsekwentnie używana bez normalnego i stycznego pola zdefiniowanego na podstawie na wierzchołek, uczynisz to najlepszą odpowiedzią na ten zagadkowy problem dla większości początkujących programistów graficznych!
teodron

Dobra odpowiedź, ale OpenGL nie interpoluje normalnie na każdej twarzy. Musisz to zrobić sam i dostarczyć interpolowaną wartość normalną do OpenGL (lub do kodu modułu cieniującego).
Anastasios G

1
@AnastasiosG Myślę, że mówi o domyślnym zachowaniu różnych danych, gdy są one interpolowane w trójkącie, ilekroć fragment jest obliczany dla określonej prymitywy. Wiem, że istniała flaga, której można użyć, aby powiedzieć OpenGL, aby użyła jednej konkretnej normalnej z możliwych 3 normalnych wierzchołków trójkąta, ale nie jest to zachowanie domyślne, jak jestem tego świadomy.
teodron

1
@AnastasiosG Myślałem, że takie szczegóły nie przyniosą żadnej odpowiedzi, ponieważ nie chodzi o to, jak korzystać z OpenGL. Ale jeśli to pomaga, w erze ustalonego rurociągu potrzebny był glShadeModel (GL_SMOOTH), aby powiedzieć openGL do interpolacji. W erze programowania potoków definiujesz zmienne jako zmienne lub wejścia / wyjścia w module cieniującym, aby OpenGL mógł interpolować.
concept3d

Chciałbym dodać, że mapy wypukłości są po prostu (geometrycznymi) normalnymi, które są podnoszone / obniżane na podstawie czarno-białej tekstury. :)
Entalpi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.