Passiamo ora ad un nuovo modello di illuminazione, il Phong , quello di default per le vecchie DirectX (con la differenza però che noi calcoliamo tutto nel pixel shader evitando i difetti dell'interpolazione lineare ed ottenendo una qualità molto più elevata). Il modello di illuminazione phong riprende il modello lambertian inserendo però l'effetto speculare (il bagliore delle auto è un esempio di specular). La luce speculare dipende sia dall'oggetto, attraverso le normali, sia dalla posizione dell' osservatore. La formula di illuminazione è la seguente Float4 D= lightDiffuseColor * dot(N,-L); float3 V=normalize(eyePosition - vertexPosition); float3 R=normalize(2.0F * N * dot( N, L) - L); float4 S= lightSpecularColor * pow(max(0.0F,dot(R,V)),power); Float4 finalColor = A + MaterialDiffuseColor * D + MaterialSpecularColor * S; - D è la diffuse light, calcolata come nel precedente tutorial.
- L è la direzione della luce
- V è il vettore EyeDirection che si ottiene come direzione tra la posizione della telecamera e quella del vertice
- R è il vettore riflessione
- S è la specular light che si ottiene elevando a potenza il prodotto fattoriale tra R e V. L'esponziale è il valore scalare power, che definisce l'intensità.
- A è la luce ambientale, ossia un incremento nel valore per simulare la presenza di luce diffusa
- MaterialDiffuseColor e MaterialSpecularColor sono i colori che l'oggetto emetto a contatto con la luce diffuse e specular
La somma tra la luce ambientale, diffusa e speculare è la phong light, probabilmente il modello di illuminazione più diffuso. Notare infine che in caso di più sorgenti luminose il valore D ed il valore S sono le somme dei medesimi valori calcolati singolarmente per ogni sorgente. Vi lascio al demo Demo
|