2010-09-26 16 views
8

Sto imparando a utilizzare mappe normali (per illuminazione pixel?) In grafica 2D con OpenGL.Come applicare una mappa normale in OpenGL?

Nuova mappatura normale, sono riuscito a comprendere l'operatore Sobel e la generazione di mappe normali (principalmente grazie a this), che sta creando una matrice (2D) di normali da una matrice (2D) di pixel dati.

(La maggior parte delle esercitazioni e discussioni del forum che ho trovato erano specifici al 3D usa e software di modellazione. Io lo scopo di implementare questa funzionalità io stesso, in C++.)

  • cosa devo fare una volta che ho' hai la normale mappa ?
  • Devo registrarlo con OpenGL?
  • Ha bisogno di essere associato con la trama, se sì, come è fatto fatto?
  • Come viene mappato su un quadrilatero 2D strutturato?
  • (E 'questo qualcosa che posso fare a meno di shaders/GLSL?)

risposta

6

io consiglio di guardare:

This nvidia presentation on bumb mapping

non ho guardato a questo per un po ', ma mi ricordo che andando oltre la maggior parte dei dettagli in attuazione di un urto mappa dello shader, dovrebbe ottenere un poche idee in esecuzione.

This other nvidia tutorial for implementing bump mapping in the cg shader langauge

This bump mapping tutorial might also be helpful.

So che non si tratta di mappature normali ma sono un buon inizio.

Inoltre, anche se ci sono differenze nei linguaggi shader, non dovrebbe essere difficile convertire i formule tra loro se si desidera utilizzare GLSL.

Come ybungalobill Detto questo, si può fare senza shader, ma a meno che non si sta lavorando su un progetto educativo (per tuo istruzione) o di un particolare dispositivo embedded, non ho idea perché l'inferno che si vorrebbe - ma se hai bisogno di this è dove vuoi guardare, è stato scritto prima degli shader e aggiornato per farvi riferimento più tardi.

+0

Grazie, la presentazione nVidia e quelle 3DKingdoms sono fantastiche. Ho visto paulsprojects uno, ma ero perso quando è iniziato su cubo mappe. – zyndor

5
  • Cosa faccio una volta che ho la mappa normale?
  • Devo registrarlo con OpenGL?

Sì, è necessario caricarlo come trama.

  • Ha bisogno di essere associati con la texture, se sì, come si fa?

Se si intende associato alla trama del colore, quindi no. È necessario creare una trama che trattiene la mappa normale per poterla utilizzare successivamente con OpenGl.

  • Come viene mappato su un quadrante 2D strutturato?

La mappa normale è solo un altro tessuto, si associa e mappa come qualsiasi altra struttura.

La normale mappa memorizza le normali nelle coordinate dello spazio tangente, quindi per calcolare l'illuminazione per pixel è necessario conoscere la posizione relativa della sorgente luminosa nel sistema di coordinate dello spazio tangente. Questo viene fatto impostando parametri aggiuntivi per vertice (normale, tangente, binomiale), calcolando la posizione della sorgente luminosa in coordinate dello spazio tangente e interpolando questa posizione lungo i triangoli. Nello shader del frammento si ricerca la normale nella mappa normale ed è possibile eseguire il calcolo dell'illuminazione desiderato in base ai parametri interpolati.

  • (E 'questo qualcosa che posso fare a meno di shaders/GLSL?)

Sì, è possibile utilizzare alcune estensioni precedenti per programmare le funzioni di combinazione ambiente multi-texture. Non l'ho mai fatto da solo ma sembra un inferno.

+0

grande, multitexturing è quello che avevo in mente (e sì, andrò con shaders =)). Grazie! – zyndor

1

l'argomento è abbastanza vecchio, ma ti risponderò per qualsiasi principiante che potrebbe cercare qualsiasi aiuto qui:

1) & 2)

vostra mappa normale è come un normale texture di diffusione, si è necessario caricarlo dal disco, creare la trama2D come si farebbe con la trama diffusa e bloccarla con le altre trame per inviarla agli shader. Quindi, per riassumere, le mappe normali, le mappe di altezza, ecc. Non sono diverse quando le gestisci dal lato CPU ... le carica sempre, crea la trama e le blocca.

3)

mappe normali sono solo un modo per memorizzare normali di ogni frammento in una texture. È meglio usarli con la trama diffusa corrispondente, perché è così che si possono simulare i piccoli dettagli. Tuttavia, in alcuni casi non è sempre necessario ... ad esempio, l'ultima volta che stavo lavorando a un rendering dell'acqua ... Ho usato una mappa DUDV e una mappa normale, ma non la mappa diffusa corrispondente, come utilizzato per il rendering in trame per ottenere il riflesso.

4)

mappe normali vengono mappati con la stessa struttura coordinate della texture di diffusione ... significa che se si dispone di un quad coordinate wich sono 0; 0, 0, 1, 1, 0, 1; 1 queste sono le coordinate che si usano per mappare entrambe le trame.

5)

si potesse fare senza shader, immagino ... si può anche fare a meno di OpenGL se vuoi ... shader sono progettati per questo tipo di operazioni, e sarà più facile fallo con gli shader.

Quindi, le mappe normali sono trame che codificano i vettori normali in colori ... un vettore normale è un vettore 3D e anche i colori sono vettori 3D. Quando si usa l'illuminazione, di solito si inviano le normali dallo shader del vertice allo shader del frammento ... lo shader del frammento interpola il valore del vertice normale per trovare un'approssimazione del vettore normale del pixel stesso. viene eseguito per impostazione predefinita ...

Con le mappe normali, non si utilizza un vettore normale del vertice, ma il vettore normale codificato nella trama.

Prima di tutto, devi convertire il calcolo dell'illuminazione dallo spazio mondiale in uno spazio tangente. Questo è fatto nel vertex shader.

quindi, campionerai la tua mappa normale nello shader di frammenti come una solita trama. Avrai un colore RGB del tuo pixel. dovrai convertire quel valore in un vettore normale, cioè, moltiplicarlo per 2 e sottrarre 1, cioè, rgb * 2 - 1, quindi usarlo come vettore normale nel calcolo dell'illuminazione.

Problemi correlati