Tipi di luce (Direct3D 9)
La proprietà light type definisce il tipo di sorgente di luce in uso. Il tipo di luce viene impostato usando un valore dell'enumerazione D3DLIGHTTYPE C++ nel membro Type della struttura D3DLIGHT9 della luce. Esistono tre tipi di luci in Direct3D: luci puntate, riflettori e luci direzionali. Ogni tipo illumina gli oggetti in una scena in modo diverso, con diversi livelli di overhead di calcolo.
Luce punto
Le luci punto hanno colore e posizione all'interno di una scena, ma nessuna direzione singola. Essi danno luce equamente in tutte le direzioni, come illustrato nella figura seguente.
Una lampadina è un buon esempio di luce punto. Le luci dei punti sono influenzate dall'attenuazione e dall'intervallo e illuminano una mesh su un vertice per vertice. Durante l'illuminazione, Direct3D usa la posizione della luce del punto nello spazio globale e le coordinate del vertice illuminate per derivare un vettore per la direzione della luce e la distanza che la luce ha viaggiato. Entrambi vengono utilizzati, insieme alla normale vertice, per calcolare il contributo della luce all'illuminazione della superficie.
Luce direzionale
Le luci direzionali hanno solo colore e direzione, non posizione. Generano luce parallela. Ciò significa che tutta la luce generata dalle luci direzionali viaggia attraverso una scena nella stessa direzione. Immagina una luce direzionale come fonte di luce a distanza quasi infinita, ad esempio il sole. Le luci direzionali non sono influenzate dall'attenuazione o dall'intervallo, quindi la direzione e il colore specificati sono gli unici fattori considerati quando Direct3D calcola i colori dei vertici. A causa del numero ridotto di fattori di illuminazione, si tratta delle luci meno a elevato utilizzo di calcolo da usare.
Riflettori
I riflettori hanno colore, posizione e direzione in cui emettono luce. La luce generata da un riflettore è costituita da un cono interno luminoso e da un cono esterno più grande, con l'intensità della luce che diminuisce tra i due, come illustrato nella figura seguente.
I contenuti in evidenza sono interessati da falloff, attenuazione e intervallo. Questi fattori, così come la distanza che la luce viaggia a ogni vertice, vengono calcolati durante il calcolo degli effetti di illuminazione per gli oggetti in una scena. Il calcolo di questi effetti per ogni vertice rende i riflettori il più tempo computazionale di tutte le luci in Direct3D.
La struttura D3DLIGHT9 C++ contiene tre membri utilizzati solo dai contenuti in evidenza. Questi membri - Falloff, Theta e Phi - controllano quanto sono grandi o piccoli i coni interni ed esterni di un oggetto spotlight e il modo in cui la luce diminuisce tra di loro.
Il valore Theta è l'angolo radiante del cono interno del riflettore e il valore Phi è l'angolo per il cono esterno della luce. Il valore Falloff controlla il modo in cui l'intensità della luce diminuisce tra il bordo esterno del cono interno e il bordo interno del cono esterno. La maggior parte delle applicazioni imposta Falloff su 1.0 per creare il falloff che si verifica in modo uniforme tra i due coni, ma è possibile impostare altri valori in base alle esigenze.
La figura seguente mostra la relazione tra i valori di questi membri e il modo in cui possono influire sui coni interni ed esterni di luce di un riflettore.
I riflettori generano un cono di luce che ha due parti: un cono interno luminoso e un cono esterno. La luce è più luminosa nel cono interno e non è presente all'esterno del cono esterno, con intensità di luce attenuante tra le due aree. Questo tipo di attenuazione viene comunemente definito falloff.
La quantità di luce ricevuta da un vertice si basa sulla posizione del vertice nei coni interni o esterni. Direct3D calcola il prodotto punto del vettore di direzione (L) del riflettore e il vettore dalla luce al vertice (D). Questo valore è uguale al coseno dell'angolo tra i due vettori e funge da indicatore della posizione del vertice che può essere confrontato con gli angoli del cono della luce per determinare dove il vertice può trovarsi nei coni interni o esterni. La figura seguente fornisce una rappresentazione grafica dell'associazione tra questi due vettori.
Il sistema confronta questo valore con il coseno degli angoli interni ed esterni del riflettore. Nella struttura D3DLIGHT9 della luce, i membri Theta e Phi rappresentano gli angoli totali del cono per i coni interni ed esterni. Poiché l'attenuazione si verifica quando il vertice diventa più distante dal centro di illuminazione (anziché attraverso l'angolo totale del cono), il runtime divide questi angoli di cono in metà prima di calcolare le loro cosene.
Se il prodotto punto dei vettori L e D è minore o uguale al coseno dell'angolo del cono esterno, il vertice si trova oltre il cono esterno e non riceve luce. Se il prodotto punto di L e D è maggiore del coseno dell'angolo del cono interno, il vertice si trova all'interno del cono interno e riceve la quantità massima di luce, considerando comunque l'attenuazione sulla distanza. Se il vertice è da qualche parte tra le due aree, il falloff viene calcolato con l'equazione seguente.
Dove:
- I f è l'intensità della luce dopo il falloff
- Alfa è l'angolo tra vettori L e D
- Theta è l'angolo del cono interno
- Phi è l'angolo del cono esterno
- p è il falloff
Questa formula genera un valore compreso tra 0,0 e 1,0 che ridimensiona l'intensità della luce in corrispondenza del vertice per tenere conto della caduta. Viene applicata anche l'attenuazione come fattore della distanza del vertice dalla luce. Il grafico seguente mostra come i diversi valori di falloff possono influire sulla curva di falloff.
L'effetto di vari valori di falloff sull'illuminazione effettiva è sottile e si verifica una piccola riduzione delle prestazioni modellando la curva di falloff con valori di falloff diversi da 1,0. Per questi motivi, questo valore viene in genere impostato su 1,0.
Argomenti correlati