Jak naprawdę działa normalne mapowanie?


10

Próbuję uchwycić pojęcie normalnego mapowania, ale nie rozumiem kilku rzeczy. Krótko mówiąc, nie jestem pewien, czy normalna mapa zależy od punktu widzenia, czy nie (tj. Czy dostaniesz inną normalną mapę tego samego obiektu, gdy się wokół niego obracasz). Po drugie, nie rozumiem, dlaczego niebieskawy kolor jest dominującym kolorem na normalnych mapach.

To, co myślę o normalnych i ich stosunku do kolorów RGB, jest następujące. Kula jednostkowa reprezentuje dowolną możliwą normalną jednostkę - innymi słowy, składowe X, Y i Z wektora normalnego jednostki mieszczą się w zakresie od -1 do 1. Wszystkie składowe koloru RGB mają zakres od 0 do 255. Dlatego ma to sens odwzorować -1 (składnik normalny) na 0 (składnik koloru), od 0 do 127 lub 128 oraz od 1 do 255. Każda wartość pomiędzy jest po prostu interpolowana liniowo.

Zastosowanie tego odwzorowania do normalnych dowolnego obiektu 3D daje bardzo kolorowy obraz, wcale nie przeważnie niebieski. Na przykład, biorąc kostkę, wszystkie sześć twarzy miałoby inny, ale jednolity kolor. Na przykład twarz z normalną (1,0,0) to (255,128,128), twarz z normalną (0,0, -1) to (128, 128, 8) i tak dalej.

Jednak z jakiegoś powodu normalne mapy znalezionego sześcianu są całkowicie niebieskawe, tj. (128 128 285). Ale oczywiście normalne nie wszystkie są w dodatnim kierunku Z, tj. (0,0,1). Jak to działa?

[Edytować]

Ok, więc podejście opisane powyżej wydaje się być nazywane normalną mapą przestrzeni obiektów lub normalną mapą przestrzeni świata . Druga nazywana jest normalną mapą przestrzeni stycznej . Rozumiem, jak takiej normalnej mapy przestrzeni stycznej można użyć do zmodyfikowania normalnych geometrii, ale wciąż nie jestem całkowicie pewien, w jaki sposób jest ona obliczana (patrz mój komentarz do odpowiedzi Nicola Bolasa).

[Edytuj 2]

Powinienem chyba wspomnieć, że pracuję z częściowymi powierzchniami parametrycznymi. Powierzchnie te składają się z zestawu łat powierzchniowych , przy czym każda łata jest powiązana z własną przestrzenią parametryczną (u, v) = [0,1] x [0,1]. W dowolnym punkcie powierzchni normalną można dokładnie obliczyć. Najwyraźniej wektory T ( styczna ) i B ( dwu-styczna ) - wymagane do rozciągnięcia przestrzeni stycznej - nie są po prostu częściowymi pochodnymi łatki powierzchniowej w kierunku u i v ...


Czy próbowałeś kiedyś zastosować phong lub przynajmniej rozproszone cieniowanie? Czy znasz podstawowe wzory, takie jak kropka (a, b) = cos (kąt (a, b)) dla wektorów jednostkowych a, b? Kilka godzin wdrożenia pozwoliłoby Ci zaoszczędzić lata zmagań.
Ivan Kuckir

@Ailurus: zobacz mój komentarz / odpowiedź na temat tego, jak podejść do tego samego problemu dla obiektów terenu / pól wysokości. Robi się to trochę bardziej skomplikowane w przypadku innych obiektów, ale pojęcia nie powinny się różnić.
teodron

Szczególny przypadek normalnego mapowania terenu: gamedev.stackexchange.com/questions/43894/...
teodron

Odpowiedzi:


14

Mapowanie tekstury to mapowanie między punktami na powierzchni 3D i odpowiadającymi im punktami na obrazie tekstury. Jeśli masz odwzorowanie tekstury 1: 1, to każdy punkt na powierzchni 3D jest odwzorowywany na konkretny i unikalny punkt na obrazie tekstury (choć odwrotność nie musi być prawdziwa. Niektóre lokalizacje tekstury niekoniecznie muszą być mapowane na lokalizacje na powierzchni).

Dzięki takiemu odwzorowaniu można przejść przez powierzchnię 3D i zapisać każdą odrębną normalną w odpowiednim miejscu w teksturze.

OK dobrze, zróbmy to. Przejdziemy przez powierzchnię 3D i wygenerujemy normalne obiekty-przestrzeń mapowane lokalizacje, a następnie przykleimy je do tekstury. Kiedy więc chcemy renderować, po prostu pobieramy normalną przestrzeń przedmiotową z tekstury i gotowe. Dobrze?

Cóż, to by zadziałało. Ale oznacza to również, że normalne tekstury mogą być używane tylko z tym konkretnym przedmiotem. Oznacza to również, że normalne tekstury mogą być używane tylko z tym obiektem i tym konkretnym mapowaniem tekstury . Jeśli więc chcesz w jakiś sposób obrócić mapowanie tekstur lub zmienić je za pomocą transformacji UV, nie masz szczęścia.

Ogólnie rzecz biorąc, ludzie używają normalnych map, gdzie normalne są w „przestrzeni stycznej”. Przestrzeń styczna to przestrzeń względem odwzorowanego punktu na powierzchni 3D, gdzie niezmodyfikowana normalna znajduje się w kierunku + Z, a osie X i Y wskazują wzdłuż osi U i V względem powierzchni.

Przestrzeń styczna zasadniczo reguluje wartości normalne. W przestrzeni stycznej normalna (0, 0, 1) zawsze oznacza „niemodyfikowany”; jest to normalna wartość interpolacji normalnej wierzchołka. Prowadzi to do wielu użytecznych rzeczy, które możesz zrobić , a jedną z najważniejszych jest przechowywanie ich w mniejszej ilości danych.

Ponieważ Z zawsze będzie dodatni, możesz więc obliczyć go w swoim module cieniującym z komponentów X i Y. Ponieważ trzeba tylko 2 wartości, więc można użyć (w OpenGL formatu obrazu nomenklatury ) GL_RG8, format 2-bajtowy-per-pixel zamiast GL_RGBA8, 4-bajtowy-per-pixel ( GL_RGB8nadal będzie 4-bajtów na piksel , ponieważ procesory graficzne będą wypełniać każdy piksel do 4 bajtów). Co więcej, możesz skompresować te dwie wartości , co prowadzi do formatu 1-bajt na piksel. Zmniejszyłeś więc rozmiar tekstury do 75% normalnej mapy obiektów i przestrzeni.

Zanim zaczniesz mówić o jakiejkolwiek normalnej mapie, musisz najpierw dowiedzieć się, co ona przechowuje. Czy jest to zwykła mapa w przestrzeni przedmiotowej, normalna mapa w przestrzeni stycznej, czy coś innego?


W porządku, więc pierwszym typem mapy, którą opisujesz, jest normalna mapa obiekt-przestrzeń , prawda? Jest to bardziej kolorowy, ponieważ przechowuje prawdziwe składowe normalne X, Y i Z. Drugi typ, normalna mapa przestrzeni stycznej , wydaje się przechowywać coś w rodzaju zakłóceń normalnych, a nie samych normalnych. Przeczytam o koncepcji przestrzeni stycznej i sprawdzę później.
Ailurus

Ok, więc przestrzeń styczna punktu na powierzchni jest po prostu przestrzenią wszystkich wektorów stycznych tego punktu. Jednak w takim przypadku nie widzę, jak normalna widziana z przestrzeni stycznej może być czymś innym niż (0,0,1)? Innymi słowy, zawsze oczekiwałbym, że normalna mapa będzie jednolicie niebieska (128, 128, 255). Jednak przykład pokazany na stronie wikipedii ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) zawiera inne kolory. Rozumiem, w jaki sposób ta mapa może być używana do zmiany normalnych, ale nie w jaki sposób jest ona faktycznie obliczana.
Ailurus

@Ailurus: „ Ok, więc przestrzeń styczna punktu na powierzchni jest po prostu przestrzenią wszystkich wektorów stycznych tego punktu. ” Nie, nie jest. Jest to przestrzeń zdefiniowana przez (niezmodyfikowaną) normę i kierunek współrzędnych tekstury w tym punkcie na powierzchni. Normalizował normalną przechowywaną w teksturze jako odnoszącą się do mapowania tekstury i bieżącą normalną przed modyfikacjami.
Nicol Bolas

Prawdopodobnie najtrudniejszą częścią normalnej mapy jest samo mapowanie (w tym sposób obliczania wektorów stycznych). Czy obliczenie wektorów stycznych nie jest wewnętrznie związane z mapowaniem / zawijaniem UV rozproszonej tekstury ORAZ geometrią obiektu? Mówiąc inaczej: masz dwie różne normalne mapy dla obiektu, ale obliczone jest tylko jedno pole styczne (i normalne). Może się okazać, że nie można konsekwentnie używać pola stycznej z dwoma różnymi normalnymi teksturami (chociaż geometrycznie można znaleźć odpowiednie odwzorowania UV, co nie jest trywialnym zadaniem).
teodron

@NicolBolas Ah, pomyliłem się, ponieważ niektóre źródła twierdzą, że wektory T, B i N tworzą podstawę ortonormalną, podczas gdy inne wspominają, że niekoniecznie jest to prawdą.
Ailurus,

3

Normalne mapy są mapowane przy użyciu tak zwanej przestrzeni stycznej, która jest zasadniczo przestrzenią lokalną opartą na przestrzeni tekstur modelu. To powinno odpowiedzieć na oba pytania.

To nie zależy od punktu widzenia, ponieważ ta przestrzeń nie ma nic wspólnego z kamerą. Na normalnej mapie Z to kierunek w górę. Jeśli spojrzysz na normalne modelu, większość normalnych wektorów będzie wskazywać bezpośrednio na siatce. Powierzchnia siatki jest przestrzenią tekstury, o której mówiłem, więc w tym lokalnym układzie współrzędnych góra jest skierowana na zewnątrz.


Dziękujemy za wyjaśnienie tego! Jednak nie używam siatki wielokątnej jako powierzchni, ale częściowo gładką powierzchnię parametryczną . Dlatego wszystkie normalne zostałyby zapisane jako wskazujące w kierunku (0,0,1), prawda?
Ailurus

1

Przewiń w dół na tej stronie

Spójrz na prawy rysunek czarno-biały w zestawach danych - jest to (lub przynajmniej kiedyś) znane jako rysunek jeża, rendering powierzchni z rysowaniem każdej z jego normalnych

Tak więc, aby zrozumieć tradycyjną mapę normalną, pomyśl o zdenerwowanym jeżu z wystającymi wszystkimi kolcami - każdy z tych kolców jest normalny względem powierzchni jeża pod nim -

Jeśli chodzi o pytanie dotyczące kuli, jeśli żylibyście wyłącznie w przestrzeni parametrycznej, tak jak w przypadku znaczników promienia, to nieskończony zestaw normalnych do kuli stworzyłby po prostu większą kulę - w przestrzeni mozaikowanej, tj. W świecie, w którym komputer narzucałby nam chcemy czasu rzeczywistego, wtedy masz kolczaste przybliżenie kuli.

Teraz ten przykład koncentruje się na normalnej mapie OBIEKT - definiuje normalne w odniesieniu do obiektu, i jest to niezmienne przy każdym obrocie, translacji lub skalowaniu - obiektu, kamery lub czegokolwiek innego - jak wspomniano wcześniej, jest to tylko jeden rodzaj normalnej mapy, ale jest najczęstszy


0

Myślę, że możesz mieć jakieś nieporozumienia na temat normalnych map. Zasadniczo jest to sposób na symulację wyglądu czegoś wyboistego, gdy w rzeczywistości geometria jest całkowicie płaska.

Kolory normalnej mapy są interpretowane przez moduł cieniujący i przetwarzane na podstawie intensywności i kierunku światła, a także widoku z kamery. Oznacza to, że możesz mieć na przykład ceglaną podłogę, która jest całkowicie płaska, z płaską fakturą, ale ponieważ ma normalną mapę o tym samym kształcie cegły, kiedy się wokół niej rozejrzysz, światło będzie się odbijało z boku z cegieł, dzięki czemu wygląda bardziej 3D niż jest.

To oczywiście tylko złudzenie, ale jest znacznie tańsze niż posiadanie złożonej geometrii. I nie, kolory normalnej mapy się nie zmieniają. W rzeczywistości reprezentują tylko wartości do porównania w module cieniującym. Jestem pewien, że ktoś tutaj będzie mógł podać ci więcej szczegółów.


Wiem, ale i tak dziękuję za odpowiedź :)
Ailurus,
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.