Domanda

Così, ho ottenuto di illuminazione di base nella mia ricerca di apprendimento OpenGL.

Immaginate questo modello di illuminazione più semplice. Ogni vertice ha una posizione, colore, e normale. Lo shader ottiene la matrice ModelViewProjection ( MVP ), matrice Modelview ( MV ), e matrice normale ( N ), che calcola come ( MV -1 ) T , così come LightColor e LightDirection come uniformi. Le esegue vertex shader i calcoli di illuminazione -. Shader frammento Uscite solo i colori interpolati

Ora, in ogni tutorial su questo argomento mi sono imbattuto vedo due cose quel puzzle me. In primo luogo, la LightDirection è già assunto di essere in coordinate dell'occhio. In secondo luogo, il colore di uscita è calcolato come

max(0, dot(LightDirection, N * normal))*LightColor*Color;

Mi aspetterei che il LightDirection deve essere invertita prima, che è, la formula corretta penserei è

max(0, dot(-LightDirection, N * normal))*LightColor*Color;

Sembra che si presume che il LightDirection è in realtà l'inverso del vettore del flusso luminoso effettivo.

Q1: È questa una sorta di convenzione stabilito che il LightDirection in questo modello viene considerato il vettore alla sorgente infinitamente lontano della luce invece che il vettore della direzione della luce o è questa non è una questione capitale e così è accaduto che nelle esercitazioni mi sono imbattuto è stato così assunto?

Q2:? Se LightDirection è in coordinate mondo piuttosto che in coordinate dell'occhio, dovrebbe essere trasformato con la matrice normale o la matrice modelview coordinate dell'occhio

Grazie per chiarire queste cose!

È stato utile?

Soluzione

Q1: È questa una sorta di convenzione stabilito che la LightDirection in questo modello si presume essere il vettore alla sorgente infinitamente lontano di luce, piuttosto che il vettore della direzione della luce o si tratta non è una questione capitale e così è accaduto che nelle esercitazioni mi sono imbattuto è stato così assunto?

In funzione OpenGL fisso quando fornire la posizione della luce, il 4 ° parametro determinato se la luce era direzionale o posizionale. Nel caso della luce direzionale, il vettore punti alimentato verso il (infinitamente lontano) sorgente luminosa.

In caso di una sorgente di luce di posizione, LightDirection viene calcolato per vertice come LightDirection = LightPosition - VertexPosition -. Per semplicità questo calcolo è fatto nell'occhio coordinate

Q2:? Se LightDirection è in coordinate mondo piuttosto che in coordinate dell'occhio, dovrebbe essere trasformato con la matrice normale o la matrice modelview coordinate dell'occhio

In funzione fissa OpenGL la posizione della luce fornita attraverso glLighti stato trasformato dalla fine del tempo chiamata matrice modelview corrente. Se la luce era posizionale, che si sono trasformate dal solito modelview matrix. In caso di una luce direzionale, la matrice normale è stato utilizzato.

Altri suggerimenti

E 'questa una sorta di convenzione stabilito che la LightDirection in questo modello si presume essere il vettore alla sorgente infinitamente lontano di luce, piuttosto che il vettore della direzione della luce o si tratta non è una questione capitale e così è accaduto che nel il tutorial mi sono imbattuto è stato così assunto?

Nessuno dei due. Ci sono semplicemente più tipi di luci.

Una luce direzionale rappresenta una sorgente luminosa che, dal punto di vista della scena, è infinitamente lontana. Esso è rappresentato da un vettore di direzione.

Una luce posizionale rappresenta una fonte di luce che ha una posizione nello spazio della scena. Esso è rappresentato da un vettore posizione.

E 'fino al modello di illuminazione del vostro shader come a cui si utilizza. In effetti, si potrebbe avere una luce direzionale e diverse luci puntiformi, tutte che colpisce lo stesso modello. Sta a voi.

I tutorial che avete visto semplicemente usati luci direzionali. Anche se probabilmente dovrebbe avere almeno menzionato il ravvicinamento luce direzionale.

Se LightDirection è in coordinate mondo piuttosto che in coordinate dell'occhio, dovrebbe essere trasformato con la matrice normale o la matrice modelview coordinate dell'occhio?

Nessuno dei due. Se la direzione della luce è in coordinate mondo, allora avete bisogno di ottenere la normale in coordinate mondo pure. Non importa quello spazio che non illuminazione in (anche se farlo in clip-spazio o altri spazi non lineare post-proiettivi è piuttosto difficile); ciò che conta è che tutto è nello stesso spazio.

La matrice modelview OpenGL predefinito fa quello che dice: si va dallo spazio modello a Visualizza di spazio (spazio degli occhi). Si passa attraverso lo spazio mondo, ma non si ferma qui. E l'OpenGL matrice normale di default è solo l'inverso-trasposta della matrice modelview. Quindi, nessuno di loro si arriva a mondo di spazio.

In generale, è consigliabile non accendendo (o qualsiasi altra cosa sulla GPU) nello spazio mondo, per ragioni di meglio spiegato altrove . Per fare illuminazione nello spazio mondo, è necessario disporre di matrici che si trasformano in spazio mondo. Il mio suggerimento sarebbe quello di farlo bene:. Mettere la direzione della luce nello spazio degli occhi, e lo spazio mondo permesso di codice della CPU

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top