Nebbia vertice (Direct3D 9)
Quando il sistema esegue il fogging dei vertici, applica calcoli nebbia a ogni vertice in un poligono e quindi interpola i risultati attraverso il volto del poligono durante la rasterizzazione. Gli effetti nebbia dei vertici vengono calcolati dall'illuminazione e dal motore di trasformazione Direct3D. Per altre informazioni, vedere Parametri fog (Direct3D 9).
Se l'applicazione non usa Direct3D per la trasformazione e l'illuminazione, l'applicazione deve eseguire calcoli nebbia. In questo caso, posizionare il fattore di nebbia calcolato nel componente alfa del colore speculare per ogni vertice. È possibile usare qualsiasi formula desiderata, ovvero basata su intervallo, volumetrico o in altro modo. Direct3D usa il fattore di nebbia fornito per interpolare la faccia di ogni poligono. Le applicazioni che eseguono la propria trasformazione e illuminazione devono anche eseguire calcoli di nebbia dei vertici. Di conseguenza, tale applicazione deve abilitare solo la fusione della nebbia e impostare il colore della nebbia attraverso gli stati di rendering associati, come descritto in Fog Blending (Direct3D 9) e Fog Color (Direct3D 9).
Nota
Quando si usa un vertex shader, è necessario usare la nebbia dei vertici. Questa operazione viene eseguita usando il vertex shader per scrivere l'intensità di nebbia per vertice nel registro oFog. Al termine del pixel shader, i dati oFog vengono usati per interpolare in modo lineare con il colore nebbia. Questa intensità non è disponibile in un pixel shader.
Range-Based nebbia
Nota
Direct3D usa calcoli nebbia basati su intervalli solo quando si usa la nebbia dei vertici con la trasformazione e il motore di illuminazione Direct3D. Ciò è dovuto al fatto che la nebbia pixel viene implementata nel driver del dispositivo e non esiste attualmente alcun hardware per supportare la nebbia basata sull'intervallo di pixel. Se l'applicazione esegue la propria trasformazione e illuminazione, deve eseguire calcoli di nebbia personalizzati, basati sull'intervallo o in altro modo.
A volte, l'uso della nebbia può introdurre artefatti grafici che causano la fusione degli oggetti con il colore della nebbia in modi non intuitivi. Si immagini, ad esempio, una scena in cui ci sono due oggetti visibili: uno abbastanza distante da essere interessato dalla nebbia e l'altro abbastanza vicino per non essere interessato. Se l'area di visualizzazione ruota sul posto, gli effetti di nebbia apparenti possono cambiare, anche se gli oggetti sono stazionari. Il diagramma seguente mostra una visualizzazione dall'alto verso il basso di tale situazione.
Nebbia basata su intervallo è un altro modo, più accurato, per determinare gli effetti della nebbia. Nella nebbia basata su intervalli, Direct3D usa la distanza effettiva dal punto di vista a un vertice per i calcoli della nebbia. Direct3D aumenta l'effetto della nebbia man mano che aumenta la distanza tra i due punti, anziché la profondità del vertice all'interno della scena, evitando così artefatti rotazionali.
Se il dispositivo corrente supporta la nebbia basata sull'intervallo, imposta il valore D3DPRASTERCAPS_FOGRANGE nel membro RasterCaps di D3DCAPS9 quando chiami il metodo IDirect3DDevice9::GetDeviceCaps. Per abilitare la nebbia basata sull'intervallo, impostare lo stato di rendering D3DRS_RANGEFOGENABLE su TRUE.
La nebbia basata su intervallo viene calcolata da Direct3D durante la trasformazione e l'illuminazione. Anche le applicazioni che non usano la trasformazione Direct3D e il motore di illuminazione devono eseguire calcoli di nebbia vertice personalizzati. In questo caso, specificare il fattore di nebbia basato sull'intervallo nel componente alfa del componente speculare per ogni vertice.
Uso della nebbia dei vertici
Usare la procedura seguente per abilitare la nebbia dei vertici nell'applicazione.
- Abilitare la fusione nebbia impostando D3DRS_FOGENABLE su TRUE.
- Impostare il colore della nebbia nello stato di rendering D3DRS_FOGCOLOR.
- Scegliere la formula di nebbia desiderata impostando lo stato di rendering D3DRS_FOGVERTEXMODE su un membro del tipo enumerato D3DFOGMODE.
- Impostare i parametri di nebbia come desiderato per la formula di nebbia selezionata negli stati di rendering.
L'esempio seguente, scritto in C++, mostra l'aspetto di questi passaggi nel codice.
// For brevity, error values in this example are not checked
// after each call. A real-world application should check
// these values appropriately.
//
// For the purposes of this example, g_pDevice is a valid
// pointer to an IDirect3DDevice9 interface.
void SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)
{
float Start = 0.5f, // Linear fog distances
End = 0.8f;
// Enable fog blending.
g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
// Set the fog color.
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
// Set fog parameters.
if(D3DFOG_LINEAR == Mode)
{
g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
// Enable range-based fog if desired (only supported for
// vertex fog). For this example, it is assumed that UseRange
// is set to a nonzero value only if the driver exposes the
// D3DPRASTERCAPS_FOGRANGE capability.
// Note: This is slightly more performance intensive
// than non-range-based fog.
if(UseRange)
g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
}
Alcuni parametri fog sono obbligatori come valori a virgola mobile, anche se il metodo IDirect3DDevice9::SetRenderState accetta solo valori DWORD nel secondo parametro. Questo esempio fornisce correttamente i valori a virgola mobile a questi metodi senza conversione dei dati eseguendo il cast degli indirizzi delle variabili a virgola mobile come puntatori DWORD e quindi dereferenziandoli.
Argomenti correlati