Illuminazione diffusa (Direct3D 9)

Dopo aver regolato l'intensità della luce per qualsiasi effetto di attenuazione, il motore di illuminazione calcola la quantità di luce rimanente riflette da un vertice, dato l'angolo della normale vertice e la direzione della luce incidente. Il motore di illuminazione passa a questo passaggio per le luci direzionali perché non attenuano la distanza. Il sistema considera due tipi di reflection, diffusi e speculari, e usa una formula diversa per determinare la quantità di luce riflessa per ognuna. Dopo aver calcolato le quantità di luce riflessa, Direct3D applica questi nuovi valori alle proprietà di riflessione diffusa e speculare del materiale corrente. I valori di colore risultanti sono i componenti diffusi e speculari usati dal rasterizzatore per produrre l'ombreggiatura gouraud e l'evidenziazione speculare.

L'illuminazione diffusa è descritta dall'equazione seguente.

Illuminazione diffusa = sum[Cd*Ld*(N. Ldir)*Atten*Spot]

Parametro Valore predefinito Tipo Descrizione
Sum N/D N/D Sommazione del componente diffuso di ogni luce.
Cd (0,0,0,0) D3DCOLORVALUE Colore diffuso.
Ld (0,0,0,0) D3DCOLORVALUE Colore diffuso chiaro.
N N/D D3DVECTOR Normale vertice
Ldir N/D D3DVECTOR Vettore di direzione dal vertice dell'oggetto alla luce.
Atten N/D FLOAT Attenuazione della luce. Vedere Attenuazione e fattore spotlight (Direct3D 9).
Spot (Contante) N/D FLOAT Fattore spotlight. Vedere Attenuazione e fattore spotlight (Direct3D 9).

 

Il valore per Cd è:

  • vertex color1, se DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1 e il primo colore del vertice viene fornito nella dichiarazione del vertice.
  • vertex color2, se DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2 e il secondo colore del vertice viene fornito nella dichiarazione del vertice.
  • colore diffuso del materiale

Nota

Se viene utilizzata una delle opzioni DIFFUSEMATERIALSOURCE e il colore del vertice non viene fornito, viene utilizzato il colore diffuso del materiale.

 

Per calcolare l'attenuazione (Atten) o le caratteristiche dei contenuti in evidenza (Spot), vedere Attenuazione e fattore spotlight (Direct3D 9).

I componenti diffusi sono bloccati da 0 a 255, dopo che tutte le luci vengono elaborate e interpolate separatamente. Il valore di illuminazione diffusa risultante è una combinazione dei valori di luce ambientale, diffusa ed emissiva.

Esempio

In questo esempio, l'oggetto viene colorato usando il colore diffuso chiaro e un colore diffuso 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 );

// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );

// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, 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, che è grigio, e il colore chiaro, che è rosso brillante.

illustrazione di una sfera grigiadi una sfera rossa

La scena risultante è illustrata nella figura seguente. L'unico oggetto nella scena è una sfera. Il calcolo dell'illuminazione diffusa accetta il colore diffuso del materiale e della luce e lo modifica in base all'angolo tra la direzione della luce e la normale vertice usando il prodotto punto. Di conseguenza, il lato posteriore della sfera diventa più scuro come la superficie della sfera si allontana dalla luce.

illustrazione di una sfera con illuminazione diffusa

Combinando l'illuminazione diffusa con l'illuminazione ambientale dell'esempio precedente, l'intera superficie dell'oggetto viene ombreggiata. La luce ambientale oscura l'intera superficie e la luce diffusa aiuta a rivelare la forma 3D dell'oggetto, come illustrato nella figura seguente.

illustrazione di una sfera con illuminazione diffusa e illuminazione ambientale

L'illuminazione diffusa è più intensa per calcolare l'illuminazione ambientale. Poiché dipende dalle normali dei vertici e dalla direzione della luce, è possibile vedere la geometria degli oggetti nello spazio 3D, che produce un'illuminazione più realistica rispetto all'illuminazione ambientale. È possibile usare evidenziazioni speculari per ottenere un aspetto più realistico.

Matematica dell'illuminazione