Illuminazione speculare (Direct3D 9)

La modellazione della riflessione speculare richiede che il sistema non sappia solo in quale direzione la luce sta viaggiando, ma anche la direzione per l'occhio del visualizzatore. Il sistema usa una versione semplificata del modello di reflection speculare di Phong, che usa un vettore a metà strada 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 = Cs * sum[Ls * (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.
Sum N/D N/D Sommazione del componente speculare di ogni luce.
N N/D D3DVECTOR Vertice normale.
H N/D D3DVECTOR Vettore a metà strada. Vedere la sezione sul vettore a metà.
P 0,0 FLOAT Potenza di riflessione speculare. Intervallo compreso tra 0 e +infinito
Ls (0,0,0,0) D3DCOLORVALUE Colore speculare chiaro.
Atten N/D FLOAT Valore di attenuazione della luce. Vedere Attenuazione e Fattore di evidenza (Direct3D 9).
Spot (Contante) N/D FLOAT Fattore di evidenza. Vedere Attenuazione e Fattore di evidenza (Direct3D 9).

 

Il valore per Cs è:

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.
  • colore vertice2, se l'origine materiale speculare è D3DMCS_COLOR2 e il secondo colore del vertice viene fornito nella dichiarazione del vertice.
  • colore speculare del materiale

Nota

Se viene usata un'opzione di origine materiale speculare e il colore del vertice non viene fornito, viene usato il colore speculare del materiale.

 

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

Vettore a metà strada

Il vettore intermedio (H) esiste a metà tra due vettori: il vettore da un vertice oggetto alla fonte di luce e il vettore da un vertice dell'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 intermedio 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 Tipo 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 intermedio in questo modo può essere intensivo di calcolo. 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 intensa a livello di calcolo, ma molto meno accurata, quindi è consigliabile usare le applicazioni che usano la proiezione ortogonale.

Esempio

In questo esempio l'oggetto viene colorato usando 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 chiaro.

La figura seguente mostra il colore del materiale speculare, che è grigio e il colore di luce speculare, che è bianco.

illustrazione di una sfera grigia di una sfera bianca

L'evidenziazione speculare risultante è illustrata nella figura seguente.

figura dell'evidenziazione speculare

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

illustrazione della combinazione dell'evidenziazione speculare, dell'illuminazione ambientale e dell'illuminazione diffusa

L'illuminazione speculare è più intensa per calcolare l'illuminazione diffusa. In genere viene usato per fornire indizi visivi sul materiale di superficie. L'evidenziazione speculare varia in dimensioni e colore con il materiale della superficie.

Matematica dell'illuminazione