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.
L'evidenziazione speculare risultante è illustrata nella figura seguente.
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.
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.
Argomenti correlati