Mappe normali e normali


17

Sto usando l'import asset Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) per analizzare i modelli 3d.

Finora, ho semplicemente estratto i vettori normali che sono definiti per ciascun vertice nelle mie maglie. Eppure ho anche trovato vari tutorial su mappe normali ...

A quanto ho capito per le mappe normali, i vettori normali sono memorizzati in ciascun texel di una mappa normale e li estraete dalla normale trama nello shader.

Perché ci sono due modi per ottenere le normali, quale è considerata la migliore pratica e perché?

Risposte:


31

Risposta breve

Le mappe normali e le normali sono due cose diverse: le normali sono una proprietà geometrica di qualsiasi mesh / superficie il cui uso non è esclusivo per i calcoli di ombreggiatura e illuminazione, ma in realtà hanno molti altri usi, ad esempio in fisica. Le mappe normali sono trame che codificano vettori normali alternativi utilizzati nella computer grafica per simulare i dossi.

Risposta lunga

Normali nella geometria una normale è un vettore o una linea che è perpendicolare a un determinato oggetto (ad esempio piano normale, vertice normale). Le normali nella grafica vengono generalmente utilizzate per i calcoli della luce, come il calcolo della riflessione diffusa su una superficie prendendo il prodotto punto tra la direzione della luce e le normali della superficie. Le normali vengono solitamente calcolate in base alle proprietà geometriche della mesh (Volti / Vertici), prendendo il prodotto incrociato di due bordi non paralleli che si trovano sullo stesso piano.

In OpenGL le normali sono specificate per vertice (quindi chiamate attributi di vertice) anche se potrebbero essere calcolate solo per ciascuna faccia in questo caso, è necessario specificare la stessa normale per ogni vertice in una faccia. Le normali possono essere interpolate da OpenGL attraverso ogni vertice di una faccia (triangolo) in modo da poter calcolare la luce riflessa per pixel non per vertice, dando così un risultato più accurato .

Mappatura normale : d'altra parte è una tecnica in computer grafica che codifica i normali in una mappa di trama, quindi ogni normale è codificato per texel. Di solito viene utilizzato per simulare l'illuminazione di protuberanze e ammaccature (ad es. Mappatura di protuberanze, mappatura di parallasse).

Poiché le normali vengono calcolate in base alle proprietà geometriche della mesh / superficie, le Mappe normali offrono alternative normali che possono simulare i dossi per aggiungere dettagli alla superficie senza aggiungere più poligoni.

Le mappe normali vengono generalmente generate utilizzando un modello 3D molto più dettagliato, quindi calcolando le normali sulla base di questo modello e codificandolo in una Mappa normale.

Perché abbiamo bisogno di entrambi?

Beh, parlando solo di rendering, le normali e le normali mappe vengono solitamente utilizzate insieme per ottenere l'effetto di illuminazione finale, un buon esempio potrebbe essere un bump shader, in cui è necessario che le normali normali siano in grado di ottenere l'effetto di illuminazione di bump, e sarà comunque necessario geometrico normale per calcolare quello che viene chiamato spazio tangente . Lo spazio tangente viene solitamente utilizzato per fornire riutilizzabilità per le mappe normali.

Tieni presente che un normale è considerato un attributo geometrico della superficie e ha molti più usi rispetto ai soli calcoli della luce. D'altra parte, le mappe normali vengono generalmente utilizzate per effetti superficiali.

Estendere la risposta per spiegare perché gli spazi tangenti sono importanti:

Risposta breve: gli spazi tangenti vengono utilizzati per rendere le mappe normali indipendenti dalla geometria sottostante.

[EDIT] Aggiunta immagine per rappresentare la mappa normale nello spazio tangente e la mappa normale nello spazio mondiale.

inserisci qui la descrizione dell'immagine

Risposta lunga: L'immagine seguente mostra il piano UV e il normale che definisce lo spazio tangente, quando si genera una mappa normale sapremo già che lo spazio utilizzato avrà sempre il puntamento Normale nella direzione Z (ecco perché le mappe normali sembrano bluastre) , questo ci aiuterà a ignorare la curvatura superficiale **,.

Lo spazio tangente ci dà il vantaggio che la nostra codifica normale delle mappe non è vincolata a normali normali mesh. Supponiamo che codifichiamo la nostra normale mappa nel mondo o nello spazio degli oggetti, quindi ogni normale che codificheremo avrà una direzione basata sul modo in cui le normali normali della mesh variano nello spazio del mondo, per non parlare della trasformazione della tua normale mappa.

inserisci qui la descrizione dell'immagine

Nelle due immagini sopra è abbastanza chiaro che lo spazio delle tangenti rende le mappe normali (a destra), indipendenti dalla geometria sottostante perché tutte le normali sono codificate nella stessa direzione con una piccola variazione per simulare l'effetto dei dossi.

** la curvatura della superficie è definita dalla quantità che un oggetto geometrico devia dall'essere piatto, o dritto nel caso di una linea, ma questo è definito in modi diversi a seconda del contesto.

Rappresentazione dello spazio tangente


1
Se riesci a trovare un'immagine che descrive come una trama normale da sola non può essere utilizzata in modo coerente senza un campo normale e tangente definito su una base per vertice, questa sarà la risposta migliore su questo problema enigmatico per la maggior parte dei programmatori grafici principianti!
teodron,

Bella risposta ma le normali non sono interpolate da OpenGL su ogni faccia. Devi farlo da solo e fornire il normale interpolato a OpenGL (o al tuo codice shader).
Anastasios G,

1
@AnastasiosG Penso che stia parlando del comportamento predefinito di dati variabili mentre viene interpolato su un triangolo ogni volta che viene calcolato un frammento per una primitiva specifica. So che c'era una bandiera che potevi usare per dire a OpenGL di usare una normale specifica tra le possibili 3 normali vertici di un triangolo, ma questo non è il comportamento predefinito di cui sono a conoscenza.
teodron,

1
@AnastasiosG Ho pensato che tali dettagli non avrebbero fatto la risposta in alcun modo poiché non si tratta di come usare OpenGL. Ma se ciò aiuta, nell'era della pipeline fissa era necessario glShadeModel (GL_SMOOTH) in ordine per dire a openGL di interpolare. Nell'era della pipeline programmabile definisci le variabili come variabili o in / out nello shader in modo che OpenGL possa interpolare.
concept3d

Vorrei aggiungere che le mappe di rilievo sono semplicemente normali (geometriche) che vengono sollevate / abbassate in base a una trama in bianco e nero. :)
Entalpi,
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.