4.3. Componente speculare

5
Il tuo voto: Nessuno Media: 5 (1 vote)

In natura, questa e la componente successiva sono in realtà riunite in un'unica proprietà che dipende dalla levigatezza della parte superficiale del materiale; si preferisce tuttavia implementarla come due componenti distinte data l'attuale impossibilità di effettuare sulle GPU il ray-tracing in tempo reale per scene complesse. Non è comunque da escludere una tale eventualità in un futuro molto prossimo, non è più un segreto che nVidia e ATI/AMD puntino proprio verse questa direzione.

Per ora è di vitale importanza, onde evitare confusioni successivamente, individuare immediatamente le caratteristiche e la corretta denominazione di questa e della componente trattata nel capitolo succesivo.

La componente speculare è individuabile come la quantità di luce riflessa in modo speculare da una superficie. La sua intensità è pari al coseno dell'angolo formato da due vettori: il riflesso del vettore vista rispetto alla normale locale ed il vettore illuminazione.

spec = (reflect(ViewVec · normal) · LightVec)specularExponent

Questa equazione dunque è simile a quella vista precedentemente per la componente diffusa; si riferisce tuttavia a differenti vettori e proprio per questo l'intensità apparente di un determinato punto di una superficie non dipende solo dall'angolazione della luce incidente, ma anche dalla posizione del punto di vista. A differenza della componente diffusa non è influenzata dalla distanza dalla sorgente luminosa (almeno nei modelli di illuminazione qui utilizzati), tuttavia a discrezione del designer o del programmatore può essere affetta da questa variabile.

L'esponente definito con specularExponent definisce la dimensione e l'incisività dello spot speculare; nella realtà i materiali che hanno una superficie più liscia di altri devono essere rappresentati con un esponente più grande con l'effetto di rendere lo spot più piccolo e dai bordi meno sfumati.

Codice HLSL da implementare in un Pixel Shader:

  // Calcolo dell'intensità dell'hot-spot speculare
  float spec = pow(saturate(dot(reflect(ViewVec, normal), LightVec)), specularExponent);

Bisogna ricordare che questa componente non riflette i colori dell'ambiente circostante e che la sua tonalità può essere controllata tramite un colore oppure, più realisticamente, con una texture; è ovviamente sempre possibile modulare il colore e la texture per ottenere un maggiore controllo o derivare altri materiali da uno preso come base.