2013-07-06 10 views
6

Sto imparando la grafica OpenGL e sto entrando nell'ombra. Le esercitazioni che sto leggendo mi stanno dicendo di trasformare le mie normali e il vettore di luce nello spazio della fotocamera. Perchè è questo? Perché non riesci a mantenere le corde nello spazio modello?Perché si utilizza lo spazio della fotocamera invece dello spazio modello per le normali?

Una domanda di follow-up è come gestire le trasformazioni del modello. Non riesco a trovare una risposta definitiva. Al momento ho questo codice:

vec3 normCamSpace = normalize(mat3(V) * normal);" 
vec3 dirToLight = (V*vec4(lightPos, 0.0)).xyz;" 
float cosTheta = clamp(dot(normCamSpace, dirToLight),0,1);" 

V è la matrice di visualizzazione o la matrice della telecamera. Non sono sicuro di come spostare o modificare la luce quando il modello cambia in posizione, rotazione e scala.

risposta

7

Il motivo principale è che in genere le posizioni di luce non vengono fornite nello spazio modello, ma nello spazio mondiale. Tuttavia, affinché l'illuminazione funzioni in modo efficiente, tutti i calcoli devono avvenire in uno spazio comune. Nella tua solita catena trasformazione, modello coordinate locali vengono trasformate dalla matrice modelview direttamente nello spazio vista

p_view = MV · p_local 

Poichè normalmente ha un solo matrice modelview sarebbe ingombrante per separare questo steap in qualcosa come

p_world = M · p_local 
p_view = V · p_world 

Per questo è necessaria la separazione della MV.

Poiché la trasformazione di proiezione si verifica tradizionalmente come un passaggio separato, lo spazio di visualizzazione è il "terreno inferiore comune" naturale su cui basare il calcolo dell'illuminazione. Implica solo la trasformazione trasformando le posizioni di luce dal mondo allo spazio visivo, e poiché le posizioni di luce non sono molto complesse, ciò viene fatto sulla CPU e le posizioni di luce tradotte sono date come shader.

Nota che nulla ti impedisce di eseguire calcoli di illuminazione nello spazio mondiale o di modellare lo spazio locale. Ci vuole solo trasformare correttamente le posizioni chiare.

+0

OK, ha senso, anche se ho quel livello di separazione.Tuttavia, sono ancora incerto su come modificare la sorgente di luce e le posizioni in modo da adattarsi a cose come rotazioni e traduzioni. – user975989

+0

Il modo canonico è di trasformare la posizione della luce proprio mentre trasformi la posizione del vertice. E in caso di proiettori (per i quali è richiesta la direzione dello spot) si trasforma la direzione spot proprio come si trasformerebbero le normali. Per ogni matrice di trasformazione tra spazi (ciò vale anche per la trasformazione da, diciamo, da mondo a modello locale) la trasformazione normale è sempre la trasposizione inversa della trasformazione di posizione. – datenwolf

0

Sto imparando la grafica OpenGL e sto entrando nell'ombra. Le esercitazioni che sto leggendo mi stanno dicendo di trasformare le mie normali e il vettore di luce nello spazio della fotocamera. Perchè è questo? Perché non riesci a mantenere le corde nello spazio modello?

In realtà, se si sta scrivendo lo shader, è possibile utilizzare qualsiasi spazio di coordinate desiderato. L'IMO che calcola l'illuminazione nello spazio mondiale si sente più "naturale", ma è questione di gusti.

Tuttavia, ci sono due piccoli particolari:

  1. Non si può "naturalmente" calcola l'illuminazione nello spazio oggetti, se l'oggetto è una maglia pelle (modello del personaggio animato da ossa). Tale modello richiederà spazio mondiale o spazio di visualizzazione. Se il tuo oggetto può essere solo tradotto e ruotato (solo trasformazioni affini), l'illuminazione può essere facilmente calcolata nello spazio modello/oggetto. Penso che alcuni motori di gioco funzionino in questo modo.
  2. Se si utilizza lo spazio della fotocamera, è possibile eliminare una sottrazione quando si calcolano le luci speculari. I modelli speculari Blinn/Phong richiedono il vettore per (o da) occhio per calcolare il fattore speculare. Nel vettore dello spazio della telecamera da un punto all'altro è uguale alla posizione del punto. Questa è una ottimizzazione molto piccola e probabilmente non ne vale la pena.
Problemi correlati