Domanda

Io cerco di implementare le luci puntiformi in OpenGL con GLSL. Io mando tutti i dati necessari per gli shader. Per semplicità Io uso solo la luce diffusa qui.

Il mio esempio mostra un enorme triangolo che voglio illuminare con una sola fonte di luce. La sorgente luminosa è mostrato come un piccolo triangolo blu.

Per luce diffusa devo conoscere l'angolo tra la luce e la superficie. Pertanto, computo le normali e la direzione della luce. Il dot-prodotto sarà poi mi darà un numero compreso tra -1 e 1, mentre tutto tra 0 e 1 è illuminato.

Tuttavia, qui sono bloccato perché questo angolo viene calcolato in modo non corretto nel mio esempio. Dal momento che è difficile shader di debug, ho usato più uscite come il colore della mia superficie. Ho usato il normale come colore per il triangolo e ovunque la luce era, la superficie era sempre verde. Cioè, le normali puntano l'asse y, e quindi vengono calcolati destra. Cioè, la direzione della luce deve essere sbagliato. Tuttavia, non riesco a trovare il motivo per cui è sbagliato. La posizione della luce e la posizione del vertice' sono passati nello spazio mondo al vertex shader, che poi li trasforma in spazio occhio, calcolare la direzione della luce e passare questo allo shader frammento:

vertex shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

frammento di shader:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

Sono allegate alcune immagini di questo esempio che dimostrano definitivamente, che l'interpolazione è davvero strano. So che voglio sapere se il codice che ho incollato è corretto o se è necessario sapere di più del codice. Inoltre, è questo comportamento interpolazione normale o è un bug nel mio codice?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

In particolare la prima immagine mostra che il punto centrale della luce è non direttamente sotto la luce ma leggermente spostato al centro del triangolo.

Se mi passa "pos" per lo shader frammento (cioè, viene interpolato) e poi Calcola "lightDir" nello shader frammento, tutto funziona bene.

È stato utile?

Soluzione

Credo che la normalizzazione tuo lightDir nel vertex shader influenza il risultato che si ottiene quando l'interpolazione dei vettori perché prende la lunghezza fuori dall'equazione e quindi influisce sulla "velocità" della interpolazione.

Se si desidera una spiegazione (visivo), provare a disegnare in 2D su carta. Prima tracciare una linea (il vostro triangolo) e un punto (sorgente luminosa). Aggiungere due linee (lightDir) per entrambe le estremità della linea di sorgente luminosa e quindi ridurre (normalizzare) quelle linee lightDir modo che abbiano la stessa lunghezza e sia incontrano alla sorgente luminosa. Se si collegano entrambe le estremità delle linee lightDir normalizzati si otterrà una linea non parallela (se la fonte di luce non è esattamente nel mezzo della vostra prima linea). Ora, se si disegna una linea che va esattamente nel mezzo di una delle linee si vedrà che non passa attraverso la metà dell'altra linea, ma ha colpito un po 'verso sinistra o verso destra.

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