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.
La speculare evidenziazione risultante è mostrata nella seguente illustrazione.
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.
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.
Argomenti correlati