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.