Condividi tramite


Illuminazione speculare (Direct3D 9)

La modellazione della reflection speculare richiede che il sistema non solo sappia in quale direzione la luce sta viaggiando, ma anche la direzione verso l'occhio del visualizzatore. Il sistema utilizza una versione semplificata del modello Phong di riflessione speculare, che impiega un vettore intermedio per approssimare l'intensità della riflessione speculare.

Lo stato di illuminazione predefinito non calcola le evidenziazioni speculari. Per abilitare l'illuminazione speculare, assicurarsi di impostare D3DRS_SPECULARENABLE su TRUE.

Equazione di illuminazione speculare

L'illuminazione speculare è descritta dall'equazione seguente:

Illuminazione Speculare = Cₛ * somma[Lₛ * (N · H)P * Atten * Spot]

 

La tabella seguente identifica le variabili, i relativi tipi e i relativi intervalli.

Parametro Valore predefinito Tipo Descrizione
Cs (0,0,0,0) D3DCOLORVALUE Colore speculare.
somma N/D N/D Sommazione del componente speculare di ogni luce.
N Non disponibile D3DVECTOR Normale vertice.
H N/D D3DVECTOR Vettore a metà strada. Vedere la sezione sul vettore intermedio.
P 0.0 GALLEGGIARE Potenza di riflessione speculare. Intervallo compreso tra 0 e +infinito
Ls (0,0,0,0) D3DCOLORVALUE Colore speculare chiaro.
Attenzione N/D GALLEGGIARE Valore di attenuazione della luce. Fare riferimento a Attenuazione e Fattore Spotlight (Direct3D 9).
Luogo N/D GALLEGGIARE Fattore riflettore. Vedere Attenuazione e Fattore proiettore (Direct3D 9).

 

Il valore per Cs è uno dei seguenti:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • vertex color1, se l'origine del materiale speculare è D3DMCS_COLOR1 e il primo colore del vertice viene fornito nella dichiarazione del vertice.
  • Il colore del vertice 2, se la sorgente del materiale speculare è D3DMCS_COLOR2 e il secondo colore del vertice è specificato nella dichiarazione del vertice.
  • colore speculare del materiale

Nota

Se viene utilizzata una delle opzioni origine materiale speculare e il colore del vertice non viene fornito, viene usato il colore speculare del materiale.

 

I componenti speculari sono bloccati da 0 a 255, dopo che tutte le luci vengono elaborate e interpolate separatamente.

Il Vettore a Metà

Il vettore a metà strada (H) esiste a metà strada tra due vettori: il vettore da un vertice oggetto alla sorgente di luce e il vettore da un vertice oggetto alla posizione della fotocamera. Direct3D offre due modi per calcolare il vettore a metà strada. Quando D3DRS_LOCALVIEWER è impostato su TRUE, il sistema calcola il vettore a metà strada usando la posizione della fotocamera e la posizione del vertice, insieme al vettore di direzione della luce. La formula seguente illustra questa operazione.

H = norm(norm(Cp - Vp) + Ldir)

 

Parametro Valore predefinito Digitare Descrizione
Cp N/D D3DVECTOR Posizione della fotocamera.
Vp N/D D3DVECTOR Posizione del vertice.
Ldir N/D D3DVECTOR Vettore di direzione dalla posizione del vertice alla posizione della luce.

 

Determinare il vettore a metà strada in questo modo può essere computazionalmente intensivo. In alternativa, l'impostazione di D3DRS_LOCALVIEWER = FALSE indica al sistema di agire come se il punto di vista sia infinitamente distante sull'asse z. Ciò si riflette nella formula seguente.

H = norm((0,0,1) + Ldir)

 

Questa impostazione è meno impegnativa a livello di calcolo, ma molto meno accurata, quindi è preferibile per le applicazioni che usano la proiezione ortogonale.

Esempio

In questo esempio l'oggetto viene colorato utilizzando il colore della luce speculare della scena e un colore speculare del materiale. Il codice è illustrato di seguito.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

In base all'equazione, il colore risultante per i vertici dell'oggetto è una combinazione del colore del materiale e del colore della luce.

Le due illustrazioni seguenti mostrano il colore del materiale speculare, ovvero grigio, e il colore della luce speculare, ovvero bianco.

illustrazione di una sfera grigia di una sfera bianca

La speculare evidenziazione risultante è mostrata nella seguente illustrazione.

illustrazione dell'evidenziazione speculare

La combinazione del riflesso speculare con l'illuminazione ambientale e diffusa produce la figura seguente. Con tutti e tre i tipi di illuminazione applicati, questo assomiglia più chiaramente a un oggetto realistico.

illustrazione della combinazione di evidenziazione speculare, illuminazione ambientale e illuminazione diffusa

L'illuminazione speculare richiede più calcoli rispetto a quella diffusa. Viene in genere usato per fornire indizi visivi sul materiale della superficie. Il riflesso speculare varia in dimensioni e colore a seconda del materiale della superficie.

Matematica dell'illuminazione