Condividi tramite


Materiali (Direct3D 9)

I materiali descrivono come i poligoni riflettono la luce o sembrano generare luce in una scena 3D. Le proprietà del materiale dettagliano le caratteristiche di riflessione diffusa, riflessione ambientale, emissione di luce e evidenziazione speculare di un materiale. Direct3D usa la struttura D3DMATERIAL9 per contenere tutte le informazioni sulla proprietà del materiale. Ad eccezione della proprietà speculare, ogni proprietà viene descritta come colore RGBA che rappresenta la quantità di parti rosse, verdi e blu di un determinato tipo di luce riflette e un fattore di fusione alfa.

Reflection diffusa e ambientale

I membri diffusi e ambientali della struttura D3DMATERIAL9 descrivono come un materiale riflette l'ambiente e la luce diffusa in una scena. Poiché la maggior parte delle scene contiene luce molto più diffusa rispetto alla luce ambientale, la riflessione diffusa svolge la parte più grande per determinare il colore. Inoltre, poiché la luce diffusa è direzionale, l'angolo di incidenza per la luce diffusa influisce sull'intensità complessiva del riflesso. La riflessione diffusa è maggiore quando la luce colpisce un vertice parallelo al vertice normale. Quando l'angolo aumenta, l'effetto della riflessione diffusa diminuisce. La quantità di luce riflessa è la cosina dell'angolo tra la luce in ingresso e la normale del vertice, come illustrato nella figura seguente.

illustrazione della quantità di luce riflessa

La riflessione ambientale, come la luce ambientale, non è bidirezionale. La riflessione ambientale ha un impatto minore sul colore apparente di un oggetto reso, ma influisce sul colore complessivo ed è più evidente quando poco o nessuna luce diffusa riflette il materiale. La riflessione ambientale di un materiale è interessata dalla luce ambientale impostata per una scena chiamando il metodo IDirect3DDevice9::SetRenderState con il flag di D3DRS_AMBIENT.

La riflessione diffusa e ambientale funziona insieme per determinare il colore percepito di un oggetto e sono in genere valori identici. Ad esempio, per eseguire il rendering di un oggetto blu cristallino, si crea un materiale che riflette solo il componente blu della luce diffusa e ambientale. Quando posizionato in una stanza con una luce bianca, il cristallo sembra essere blu. Tuttavia, in una stanza che ha solo luce rossa, lo stesso cristallo sembra essere nero, perché il suo materiale non riflette la luce rossa.

Emissione

I materiali possono essere usati per rendere un oggetto di rendering che sembra essere auto-luminoso. Il membro Emissive della struttura D3DMATERIAL9 viene usato per descrivere il colore e la trasparenza della luce generata. L'emissione influisce sul colore di un oggetto e può, ad esempio, rendere più brillante un materiale scuro e prendere parte del colore generato.

È possibile usare la proprietà emissiva di un materiale per aggiungere l'illusione che un oggetto emette luce, senza incorrere nel sovraccarico di calcolo dell'aggiunta di una luce alla scena. Nel caso del cristallo blu, la proprietà emissiva è utile se si vuole far apparire il cristallo in luce, ma non fare luce su altri oggetti nella scena. Ricorda, i materiali con proprietà emissive non generano luce che può essere riflessa da altri oggetti in una scena. Per ottenere questa luce riflessa, è necessario posizionare una luce aggiuntiva all'interno della scena.

Reflection speculare

La riflessione speculare crea evidenziazioni sugli oggetti, rendendoli lucidi. La struttura D3DMATERIAL9 contiene due membri che descrivono il colore di evidenziazione speculare e la lucidità complessiva del materiale. Si stabilisce il colore delle evidenziazioni speculari impostando il membro Speculare sul colore RGBA desiderato: i colori più comuni sono bianchi o grigi leggeri. I valori impostati nel controllo membro power controllano il modo in cui gli effetti speculari sono nitidi.

Le evidenziazioni speculari possono creare effetti drammatici. Disegnando di nuovo sull'analogia del cristallo blu: un valore di potenza più grande crea evidenziazioni speculari più nitide, rendendo il cristallo sembra essere abbastanza brillante. I valori più piccoli aumentano l'area dell'effetto, creando un riflesso noioso che rende il cristallo gelido. Per rendere un oggetto veramente opaco, impostare il membro Power su zero e il colore in Speculare su nero. Sperimentare diversi livelli di riflessione per produrre un aspetto realistico per le proprie esigenze. La figura seguente mostra due modelli identici. Quello a sinistra usa una potenza di reflection speculare pari a 10; il modello a destra non ha alcuna riflessione speculare.

illustrazione dei modelli di reflection speculari

Impostazione delle proprietà del materiale

I dispositivi di rendering Direct3D possono eseguire il rendering con un set di proprietà del materiale alla volta.

In un'applicazione C++ si impostano le proprietà del materiale usate dal sistema preparando una struttura D3DMATERIAL9 e quindi chiamando il metodo IDirect3DDevice9::SetMaterial .

Per preparare la struttura D3DMATERIAL9 da usare, impostare le informazioni sulla proprietà nella struttura per creare l'effetto desiderato durante il rendering. Nell'esempio di codice seguente viene impostata la struttura D3DMATERIAL9 per un materiale viola con evidenziazioni speculari bianche nitide.

D3DMATERIAL9 mat;

// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;

// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;

// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;

// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;

Dopo aver preparato la struttura D3DMATERIAL9 , si applicano le proprietà chiamando il metodo IDirect3DDevice9::SetMaterial del dispositivo di rendering. Questo metodo accetta l'indirizzo di una struttura D3DMATERIAL9 preparata come solo parametro. È possibile chiamare IDirect3DDevice9::SetMaterial con nuove informazioni in base alle esigenze per aggiornare le proprietà del materiale per il dispositivo. Nell'esempio di codice seguente viene illustrato il modo in cui potrebbe essere visualizzato nel codice.

// This code example uses the material properties defined for 
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Quando si crea un dispositivo Direct3D, il materiale corrente viene impostato automaticamente sul valore predefinito visualizzato nella tabella seguente.

Membro Valore
Diffusa (R:0, G:0, B:0, A:0)
Speculare (R:0, G:0, B:0, A:0)
Di ambiente (R:0, G:0, B:0, A:0)
Emissiva (R:0, G:0, B:0, A:0)
Elettricità (0.0)

 

Recupero delle proprietà del materiale

Si recuperano le proprietà del materiale attualmente usata dal dispositivo di rendering chiamando il metodo IDirect3DDevice9::GetMaterial per il dispositivo. A differenza del metodo IDirect3DDevice9::SetMaterial, IDirect3DDevice9::GetMaterial non richiede la preparazione. Il metodo IDirect3DDevice9::GetMaterial accetta l'indirizzo di una struttura D3DMATERIAL9 e riempie la struttura fornita con informazioni che descrivono le proprietà del materiale correnti prima di restituire.

// For this example, the pd3dDev variable is assumed to 
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;

hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Nota

Se l'applicazione non specifica le proprietà materiali per il rendering, il sistema usa un materiale predefinito. Il materiale predefinito riflette tutte le luci diffuse, bianco, ad esempio , senza riflesso ambientale o speculare, e nessun colore emissivo.

 

Luci e materiali