Czym dokładnie jest mapowanie UV i UVW?

26

Próbuję zrozumieć podstawowe pojęcia 3D, w tej chwili próbuję dowiedzieć się, jak faktycznie działają tekstury. Wiem, że mapowanie UV i UVW to techniki mapujące tekstury 2D na obiekty 3D - powiedziała mi również Wikipedia. Poszukałem wyjaśnień, ale znalazłem tylko tutoriale, które zakładały, że już wiem, co to jest.

Z mojego zrozumienia, każdy model 3D składa się z Punktów, a kilka punktów tworzy twarz? Czy każdy punkt lub powierzchnia ma wtórną współrzędną, która odwzorowuje pozycję osi / y w Teksturze 2D? Lub w jaki sposób rozpakowywanie manipuluje modelem?

Co tak naprawdę robi W w UVW, co oferuje w stosunku do UV? Jak rozumiem, W odwzorowuje na współrzędną Z, ale w jakiej sytuacji miałbym różne tekstury dla tego samego X / Y i innego Z, czy część Z nie byłaby niewidoczna? Czy też całkowicie to nie rozumiem?

Michael Stum
źródło
1
zadaj dwa pytania osobno
Noob Game Developer
1
Tak bardzo nienawidzę facetów takich jak @NoobGameDeveloper, wszyscy inni odpowiadają na to pytanie i wszystko, co robią, to próbują znaleźć rzeczy, które są złe z pytaniem. Chodź, pozwól im zadawać pytania, nie mówię, że nikt nie powinien przestrzegać zasad, ale takie pytania są całkowicie w porządku, aby je tutaj zamieszczać.
Daniyal Azram

Odpowiedzi:

23

Twoje zrozumienie jest bliskie. Każdy model 3D składa się z wierzchołków. Każdy wierzchołek zwykle określa położenie punktu w przestrzeni, normalną (stosowaną w obliczeniach oświetlenia) i 1 lub więcej współrzędnych tekstury. Są one ogólnie oznaczone jako u dla poziomej części tekstury i v dla pionu.

Kiedy obiekt jest teksturowany, współrzędne te są używane do sprawdzenia, który tekstel lub piksel ma zostać narysowany na podstawie tekstury. Najłatwiej jest je traktować jako procenty lub proporcje między lewą krawędzią tekstury ( u = 0) a prawą krawędzią tekstury ( u = 1,0) i od góry tekstury ( v = 0) i od dołu z tego ( v= 1,0). Są interpolowane między wierzchołkami i wyszukiwane dla każdego renderowanego piksela ekranowego. Mogą być większe lub mniejsze od tych zakresów, a stan renderowania ustawiony podczas renderowania obiektu określa, co się stanie. Dostępne opcje to CLAMP i REPEAT. Zaciskanie ogranicza współrzędną do 0 lub 1, powodując rozmazanie tekstury tam, gdzie jest poza zakresem. Powtórz powoduje, że tekstura powtarza się, gdy jest poza zakresem; jest to właściwie to samo, co chwytanie tylko części dziesiętnej współrzędnej i używanie jej w miejscu.

Przed zastosowaniem współrzędnych tekstury na obiekcie są one mnożone przez macierz tekstury, aby zastosować do nich pewne przekształcenia (takie jak skalowanie, translacja lub obrót). Ten efekt jest czasem animowany w grach, aby wyglądał, jakby coś poruszało się po obiekcie bez konieczności przesuwania samego obiektu ... tekstura po prostu przewija się przez niego. Kiedy macierz tekstury jest mnożona przez współrzędne tekstury, generuje 2 wartości, które są używane do wyszukiwania tekstu w celu wykreślenia (nazwijmy je s i t ). Są one generowane automatycznie na podstawie u i v, nawet jeśli matryca tekstur nie jest ustawiona; jest to odpowiednik pomnożenia u i v przez macierz tożsamości.

To gdzie w koordynować przychodzi, choć nie jest używany tak często. Jest to dodatkowy parametr służący do pomnożenia macierzy tekstur i jest zwykle używany, gdy chcesz wziąć pod uwagę perspektywę (na przykład w mapowaniu cieni ). Działa tak samo, jak podczas przekształcania położenia w przestrzeni obiektowej w przestrzeń ekranową za pomocą macierzy rzutowania na świat. Po pomnożeniu UVW przez transformację projekcji otrzymujemy 2 współrzędne, s i t, które są następnie odwzorowywane na teksturę 2D.

Joel Baker
źródło
Warto wspomnieć, że OpenGL traktuje v0 jako dół i v1.0 jako szczyt. To kosztowało mnie dużo czasu w przeszłości, kiedy nie mogłem znaleźć błędu, gdy moje tekstury wyglądały dziwnie.
tkausl
8

Rozważ trójkąt.

Każdy narożnik ma współrzędną UV. Interpolujesz między nimi, aby uzyskać zestaw współrzędnych UV dla każdego piksela. (W grze jest także perspektywa, ale na razie zignorujmy to).

Następnie pobierasz teksturę z tekstury ze współrzędnych U i V. To znaczy piksel ze współrzędnej tekstury x, y - to samo, nieco inna terminologia, ponieważ mówimy o teksturach.

Jeśli twoja tekstura jest naprawdę trójwymiarowa, potrzebujesz również trzeciej współrzędnej, W.

Jednym ze sposobów na zwizualizowanie tego jest wyobrażenie sobie bloku drewna. Jeśli jakoś go pokroisz, zobaczysz, że każda płaszczyzna wewnątrz bloku zawiera rodzaj tekstury 2d.

Tekstury 3D są tak rzadkie, że na razie możesz o nich zapomnieć.

Jari Komppa
źródło
Rzadko spotykany? Do czego są używane? Czy możesz pokazać jakiś przykład w kontekście tytułów AAA.
Quazi Irfan
Nie, ponieważ ogólnie rzecz biorąc nigdy nie są używane. Zawsze jest jakiś tańszy sposób na zrobienie tego samego. Pomyśl o posiekanych przedmiotach w Wii Sports Plus; możesz rozbić przedmioty w dowolny sposób i zobaczyć „elementy wewnętrzne”. Mogliby zmarnować ogromne ilości pamięci, robiąc z nich tekstury 3D (zakładając, że sprzęt to obsługuje), ale o wiele taniej jest symulować to za pomocą kilku tekstur 2D.
Jari Komppa
Więc nie są wyłączne? czy nie jest to bardzo potrzebna funkcja w przypadku dobrze znanych rzeczy, które robi silnik gry?
Quazi Irfan
Nie rozumiem o co ci chodzi. Tekstury 3D mogą być użyteczne w innych zastosowaniach niż jako zwykłe tekstury; jeśli niektóre dane moduł cieniujący dogodnie mapuje na tablicę 3d, byłoby to jedno użycie. Ale jako „normalna” tekstura, generalnie są tylko marnotrawstwem pamięci.
Jari Komppa
Jednym z zastosowań tekstury 3D jest mapowanie odległości, choć jak mówi Jari, są one bardzo rzadkie w grze ze względu na swoją złożoność. [link] http.developer.nvidia.com/GPUGems2/gpugems2_chapter08.html
Jackalope
7

Pomyśl o origami.

Mapa UV jest jak spłaszczona (nieopakowana) skóra 2D siatki 3D (skorupy).

Jeśli wytniesz mapę i złożysz ją wzdłuż linii siatki, wynikiem będzie Twój model 3D.

Wartości zmiennoprzecinkowe (U, V) wynoszą od (0,0) do (1,1) Lewy górny róg mapy UV to (0,0) Prawy dolny róg to (1,1)

Każdy wierzchołek w siatce wielokątów (tris / quady) ma wartość (U, V), która mówi mechanizmowi renderującemu, której części mapy użyć.

W potoku GPU moduły cieniujące wierzchołki obliczają rzuty 2D każdego piksela w tych wielokątach 3D, a następnie dzielą je na kolory za pomocą mapy UV.

Nie można tego w pełni docenić bez takiego zdjęcia, które pokazuje wszystko:

Siatka UV

Jak wspomnieli inni komentatorzy, komponent W jest używany przez renderer do bardziej efektownych efektów, takich jak mapowanie cieni, ale mapa UV jest podstawą do zrozumienia.

Zauważ, że moduł cieniujący wierzchołki musi wywołać moduł cieniujący fragmenty co najmniej raz dla każdego piksela, który należy pokolorować. Dlatego GPU są równoległymi procesorami z dziesiątkami rdzeni - potok cieniowania jest bardzo wymagający.

Należy również pamiętać, że procesory graficzne zintegrowane z procesorem są przeznaczone dla urządzeń mobilnych i są ograniczone do mniej niż jednej dziesiątej liczby rdzeni niż w przypadku zewnętrznych układów GPU podobnej generacji. Jest to spowodowane ograniczeniami mocy i chłodzenia urządzeń mobilnych. Wydaje się, że prawo Moore'a zwolniło, ale wydajność wciąż się poprawia (z dziwnym stopniem tu i tam…)

Mapowanie UV miliardy pikseli przy 240+ klatkach na sekundę może spowodować prawdziwy gorący bałagan!

Dominic Cerisano
źródło
0

Mapa UV odwzorowuje punkt (x, y, z) w siatce na punkt (u, v) na obrazie tekstury. Ponieważ obraz mapuje (u, v) na kolor, dwie mapy można połączyć w łańcuch, uzyskując mapę z przestrzeni siatki do przestrzeni kolorów.

         uv map       color map
 (x,y,z)   ->   (u,v)    ->     color
 mesh           Texture
 space          space
golopot
źródło