Condividi tramite


Vertex Fog (Direct3D 9)

Quando il sistema esegue il fogging dei vertici, applica calcoli di nebbia a ogni vertice in un poligono e quindi interpola i risultati sulla faccia del poligono durante la rasterizzazione. Gli effetti della nebbia vertex vengono calcolati dal motore di illuminazione e 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 di nebbia. In questo caso, posizionare il fattore di nebbia calcolato nel componente alfa del colore speculare per ogni vertice. È possibile usare qualsiasi formula desiderata, basata su intervalli, volumetrici o in caso contrario. Direct3D usa il fattore di nebbia fornito per interpolare la faccia di ogni poligono. Le applicazioni che eseguono la propria trasformazione e l'illuminazione devono anche eseguire i propri calcoli di nebbia vertice. 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à della nebbia per vertice nel registro oFog. Al termine dello shader pixel, i dati oFog vengono usati per interpolare in modo lineare il colore della nebbia. Questa intensità non è disponibile in un pixel shader.

 

Range-Based Nebbia

Nota

Direct3D usa calcoli di nebbia basati su intervallo solo quando si usa la nebbia dei vertici con la trasformazione Direct3D e il motore di illuminazione. Ciò è dovuto al fatto che la nebbia dei pixel viene implementata nel driver del dispositivo e nessun hardware attualmente esiste per supportare la nebbia basata su intervalli di pixel. Se l'applicazione esegue la propria trasformazione e illuminazione, deve eseguire i propri calcoli di nebbia, in base all'intervallo o in caso contrario.

 

A volte, l'uso della nebbia può introdurre artefatti grafici che causano la fusione di oggetti con il colore della nebbia in modi non intuitivi. Ad esempio, immaginare una scena in cui ci sono due oggetti visibili: uno abbastanza distante da essere interessato dalla nebbia e l'altro abbastanza vicino per essere infetti. Se l'area di visualizzazione ruota sul posto, gli effetti di nebbia apparente possono cambiare, anche se gli oggetti sono stazioni. Il diagramma seguente mostra una visualizzazione top-down di tale situazione.

diagramma di due punti di vista e come influiscono sulla nebbia per due oggetti

La nebbia basata su intervalli è 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 perché la distanza tra i due punti aumenta, anziché la profondità del vertice all'interno della scena, evitando così artefatti rotazionali.

Se il dispositivo corrente supporta la nebbia basata su intervallo, verrà impostato il valore D3DPRASTERCAPS_FOGRANGE nel membro RasterCaps di D3DCAPS9 quando si chiama il metodo IDirect3DDevice9::GetDeviceCaps . Per abilitare la nebbia basata su intervallo, impostare lo stato di rendering D3DRS_RANGEFOGENABLE su TRUE.

La nebbia basata su intervalli viene calcolata da Direct3D durante la trasformazione e l'illuminazione. Le applicazioni che non usano la trasformazione Direct3D e il motore di illuminazione devono eseguire anche i propri calcoli di nebbia vertice. In questo caso, specificare il fattore di nebbia basato sull'intervallo nel componente alfa del componente speculare per ogni vertice.

Uso della nebbia del vertice

Seguire questa procedura per abilitare la nebbia dei vertici nell'applicazione.

  1. Abilitare la fusione della nebbia impostando D3DRS_FOGENABLE su TRUE.
  2. Impostare il colore della nebbia nello stato di rendering D3DRS_FOGCOLOR.
  3. Scegliere la formula di nebbia desiderata impostando lo stato di rendering D3DRS_FOGVERTEXMODE su un membro del tipo enumerato D3DFOGMODE .
  4. Impostare i parametri di nebbia come desiderato per la formula di nebbia selezionata negli stati di rendering.

Nell'esempio seguente, scritto in C++, viene illustrato il modo in cui questi passaggi potrebbero essere simili al 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 necessari come valori a virgola mobile, anche se il metodo IDirect3DDevice9::SetRenderState accetta solo i 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 dereferendoli.

Tipi di nebbia