Come funziona davvero la normale mappatura?


10

Sto cercando di afferrare il concetto di mappatura normale, ma sono confuso da alcune cose. In breve, non sono sicuro che una mappa normale dipenda o meno dal punto di vista (ovvero se otterrai una mappa normale diversa dello stesso oggetto quando ruoti attorno ad essa). In secondo luogo, non capisco perché il colore bluastro sia il colore predominante nelle mappe normali.

Il modo in cui penso alle normali e alla loro relazione con i colori RGB è il seguente. La sfera unitaria rappresenta qualsiasi unità normale possibile - in altre parole, i componenti X, Y e Z di un vettore normale unitario vanno da -1 a 1. I componenti di un colore RGB vanno tutti da 0 a 255. Pertanto, ha senso per mappare -1 (componente normale) su 0 (componente colore), da 0 a 127 o 128 e da 1 a 255. Qualsiasi valore in mezzo viene semplicemente interpolato linearmente.

Applicando questa mappatura alle normali di un oggetto 3D arbitrario si ottiene un'immagine molto colorata, per nulla prevalentemente blu. Ad esempio, quando si prende un cubo, tutte e sei le facce avrebbero un colore diverso, ma uniforme. Ad esempio, la faccia con il normale (1,0,0) sarebbe (255,128,128), la faccia con il normale (0,0, -1) sarebbe (128,128,0) e così via.

Tuttavia, per qualche motivo le normali mappe di un cubo che ho trovato sono completamente bluastre, cioè (128.128.255). Ma chiaramente, le normali non sono tutte nella direzione z positiva, cioè (0,0,1). Come funziona?

[Modificare]

Ok, quindi l'approccio sopra descritto sembra essere indicato come mappa normale dello spazio oggetti o mappa normale dello spazio mondiale . L'altra è chiamata mappa normale dello spazio tangente . Capisco come una normale mappa dello spazio tangente possa essere usata per modificare le normali di una geometria, ma non sono ancora del tutto sicuro di come venga effettivamente calcolata (vedi il mio commento alla risposta di Nicol Bolas).

[Modifica 2]

Dovrei probabilmente menzionare che sto lavorando con superfici parametriche a tratti. Queste superfici sono costituite da un insieme di patch di superficie , in cui ogni patch è associata al suo spazio parametrico (u, v) = [0,1] x [0,1]. In qualsiasi punto della superficie, la normale può essere calcolata esattamente. Apparentemente, i vettori T ( tangente ) e B ( bi-tangente ) - necessari per estendere lo spazio tangente - non sono semplicemente le derivate parziali del patch di superficie nella direzione di u ...


Hai mai provato a implementare il phong o almeno l'ombreggiatura diffusa? Conosci formule di base come punto (a, b) = cos (angolo (a, b)) per i vettori di unità a, b? Poche ore di attuazione ti farebbero risparmiare anni di difficoltà.
Ivan Kuckir,

@Ailurus: vedi il mio commento / risposta su come affrontare lo stesso problema per gli oggetti del terreno / campi di altezza. Diventa un po 'più complicato per altri oggetti, ma i concetti non dovrebbero differire.
teodron,

Il caso particolare della mappatura normale del terreno: gamedev.stackexchange.com/questions/43894/…
teodron,

Risposte:


14

Una mappatura delle trame è la mappatura tra i punti sulla superficie 3D e i loro punti corrispondenti su un'immagine della trama. Se si dispone di una mappatura di trama 1: 1, ogni punto sulla superficie 3D viene mappato su un punto specifico e unico nell'immagine della trama (anche se il contrario non dovrebbe essere vero. Alcune posizioni nella trama non si assocerebbero necessariamente a posizioni sulla superficie).

Con una tale mappatura, è possibile passare attraverso la superficie 3D e memorizzare ogni normale distinto nella posizione corrispondente nella trama.

OK bene, facciamolo. Attraverseremo una superficie 3D e genereremo le normali dello spazio-oggetto nelle posizioni mappate, quindi le inseriremo nella trama. Quindi, quando vogliamo renderizzare, prendiamo semplicemente lo spazio-oggetto normale dalla trama e abbiamo finito. Giusto?

Bene sì, funzionerebbe. Ma significa anche che le normali della trama possono essere utilizzate solo con quel particolare oggetto. Significa anche che le normali della trama possono essere utilizzate solo con quell'oggetto e con quella mappatura della trama specifica . Quindi, se volevi ruotare la mappatura delle trame in qualche modo o modificarla con qualche trasformazione UV, sei sfortunato.

Quindi, in generale, ciò che le persone usano sono mappe normali in cui le normali sono nello "spazio tangente". Lo spazio tangente è lo spazio relativo al punto mappato sulla superficie 3D, dove la normale non modificata è nella direzione + Z e gli assi X e Y puntano lungo gli assi U e V rispetto alla superficie.

Lo spazio tangente regolarizza essenzialmente le normali. Nello spazio tangente, il normale (0, 0, 1) significa sempre "non modificato"; è il normale che si ottiene dall'interpolazione del vertice normale. Questo porta a una serie di cose utili che puoi fare , una delle più importanti delle quali è memorizzarle in meno dati.

Poiché la Z sarà sempre positiva, puoi quindi calcolarla nel tuo shader dai componenti X e Y. Poiché sono necessari solo 2 valori, quindi è possibile utilizzare (nella nomenclatura del formato immagine OpenGL ) GL_RG8, un formato a 2 byte per pixel anziché GL_RGBA8un 4 byte per pixel ( GL_RGB8sarà comunque di 4 byte per pixel , poiché le GPU riempiono ogni pixel di 4 byte). Ancora meglio, è possibile comprimere questi due valori , portando a un formato di 1 byte per pixel. Quindi hai ridotto le dimensioni della trama al 75% della mappa normale spazio-oggetto.

Prima di poter parlare di qualsiasi tipo di mappa normale, devi prima sapere cosa memorizza. È una mappa normale spazio-oggetto, una mappa normale spazio tangente o qualcos'altro?


Bene, quindi il primo tipo di mappa che descrivi è una mappa normale spazio-oggetto , giusto? Questo è il più colorato, perché memorizza i componenti X, Y e Z reali delle normali. Il secondo tipo, la normale mappa dello spazio tangente , sembra memorizzare qualcosa come le perturbazioni alle normali piuttosto che le stesse stesse. Leggerò il concetto di spazio tangente e ricontrollerò più tardi.
Ailurus,

Ok, quindi lo spazio tangente di un punto sulla superficie è semplicemente lo spazio di tutti i vettori tangenti di quel punto. Tuttavia, in quel caso non vedo come il normale visto dallo spazio tangente possa essere nient'altro che (0,0,1)? In altre parole, mi aspetterei sempre che la mappa normale sia uniformemente blu (128.128.255). Tuttavia, l'esempio mostrato nella pagina di Wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) contiene altri colori. Capisco come questa mappa può essere utilizzata per cambiare le normali, ma non come viene effettivamente calcolata.
Ailurus,

@Ailurus: " Ok, quindi lo spazio tangente di un punto sulla superficie è semplicemente lo spazio di tutti i vettori tangenti di quel punto. " No, non lo è. È lo spazio definito dalla normale (non modificata) e la direzione delle coordinate della trama in quel punto sulla superficie. Ha regolarizzato la normale memorizzata nella trama come relativa alla mappatura della trama e alla normale corrente prima delle modifiche.
Nicol Bolas,

Probabilmente la parte più difficile di una mappa normale è la mappatura stessa (incluso come calcolare i vettori tangenti). Il calcolo dei vettori tangenti non è intrinsecamente collegato alla mappatura / avvolgimento UV della trama diffusa E alla geometria dell'oggetto? Detto in altro modo: hai due diverse mappe normali per un oggetto, ma viene calcolato solo un campo tangente (e normale). Potresti scoprire che non puoi utilizzare il campo tangente in modo coerente con due diverse trame normali (anche se geometricamente potresti trovare mappature UV adatte, che non è un compito banale).
teodron,

@NicolBolas Ah, mi sono confuso perché alcune fonti affermano che i vettori T, B e N formano una base ortonormale, mentre altri menzionano che questo non è necessariamente vero.
Ailurus,

3

Le mappe normali sono mappate usando il cosiddetto spazio tangente, che è essenzialmente uno spazio locale basato sullo spazio-trama del modello. Questo dovrebbe rispondere ad entrambe le tue domande.

Non dipende dal punto di vista poiché questo spazio non ha nulla a che fare con la fotocamera. Nella mappa normale, Z è la direzione verso l'alto. Se osservi le normali di un modello, la maggior parte dei vettori normali punta direttamente fuori dalla mesh. La superficie della mesh è lo spazio della trama di cui stavo parlando, quindi in quel sistema di coordinate locale, in alto è la direzione "esterna".


Grazie per aver chiarito questo! Tuttavia, non sto usando una mesh poligonale come superficie, ma una superficie parametrica liscia a tratti . Pertanto, tutte le normali verrebbero salvate puntando nella direzione (0,0,1), giusto?
Ailurus,

1

Scorri verso il basso in questa pagina

Guarda il disegno in bianco e nero a destra sotto i set di dati - questo è (o almeno usato per essere) noto come un disegno di riccio, un rendering di una superficie con ciascuna delle sue normali disegnate

Quindi, per capire una mappa normale tradizionale, pensa a un riccio turbato con tutte le spine che sporgono - ciascuna di quelle spine è normale alla superficie del riccio sottostante -

Per quanto riguarda la tua domanda sulla sfera, se vivessi puramente nello spazio parametrico, come con i ray traccianti, allora l'insieme infinito di normali alla sfera creerebbe semplicemente una sfera più grande - nello spazio a mosaico, cioè il mondo che il computer ci impone se vogliamo tempo reale, quindi hai un'approssimazione appuntita di una sfera.

Ora, questo esempio si è concentrato su una normale mappa OBJECT - sta definendo le normali rispetto all'oggetto, e questo è invariante sotto qualsiasi rotazione, traduzione o ridimensionamento - dell'oggetto o della fotocamera o qualsiasi altra cosa - come menzionato prima, questo è solo un tipo di mappa normale ma è la più comune


0

Penso che potresti avere delle idee sbagliate su cosa siano le normali mappe. Fondamentalmente, è un modo di simulare l'aspetto di qualcosa di irregolare quando in realtà la geometria è completamente piatta.

I colori di una normale mappa sono interpretati da uno shader tecnologico ed elaborati in base all'intensità e alla direzione della luce, nonché alla vista della videocamera. Ciò significa che potresti avere un pavimento di mattoni, ad esempio, completamente piatto, con una trama piatta, ma poiché ha una mappa normale con la stessa forma di mattone, quando ti guardi intorno, la luce sembrerà rimbalzare sul lato dei mattoni che lo fanno sembrare più 3D di quello che è.

Questa è ovviamente solo un'illusione, ma è molto più economica della geometria complessa. E no, i colori della mappa normale non cambiano. Rappresentano davvero solo valori da confrontare nello shader. Sono sicuro che qualcuno qui sarà in grado di riempirti in modo molto più dettagliato.


Lo so, ma grazie comunque per la risposta :)
Ailurus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.