Pixelnebel (Direct3D 9)

Pixelnebel erhält seinen Namen aus der Tatsache, dass er pro Pixel im Gerätetreiber berechnet wird. Dies unterscheidet sich von Vertexnebel, der von der Pipeline bei Transformations- und Beleuchtungsberechnungen berechnet wird. Pixelnebel wird manchmal als Tabellennebel bezeichnet, da einige Treiber eine vorberechnete Nachschlagetabelle verwenden, um den Nebelfaktor zu bestimmen, wobei die Tiefe der einzelnen Pixel verwendet wird, die in Mischberechnungen angewendet werden. Er kann mithilfe einer beliebigen Nebelformel angewendet werden, die von Membern des aufgezählten D3DFOGMODE-Typs identifiziert wird. Die Implementierungen dieser Formeln sind treiberspezifisch. Wenn ein Treiber keine komplexe Nebelformel unterstützt, sollte er zu einer weniger komplexen Formel degradiert werden.

Eye-Relative im Vergleich zu Z-basierten Tiefen

Um nebelbezogene Grafikartefakte zu verringern, die durch ungleichmäßige Verteilung von Z-Werten in einem Tiefenpuffer verursacht werden, verwenden die meisten Hardwaregeräte augenbezogene Tiefen anstelle von z-basierten Tiefenwerten für Pixelnebel. Die augenbezogene Tiefe ist im Wesentlichen das w-Element aus einem homogenen Koordinatensatz. Microsoft Direct3D verwendet den Kehrwert des RHW-Elements aus einem Geräteraumkoordinatensatz, um "true w" zu reproduzieren. Wenn ein Gerät augenbezogener Nebel unterstützt, wird das D3DPRASTERCAPS_WFOG-Flag im RasterCaps-Element der D3DCAPS9-Struktur festgelegt, wenn Sie die IDirect3DDevice9::GetDeviceCaps-Methode aufrufen. Mit Ausnahme des Referenzrasterizers verwenden Softwaregeräte immer z, um Pixelnebeleffekte zu berechnen.

Wenn augenbezogener Nebel unterstützt wird, verwendet das System automatisch die relative Augentiefe und nicht die z-basierte Tiefe, wenn die bereitgestellte Projektionsmatrix im Weltraum Z-Werte erzeugt, die w-Werten im Geräteraum entsprechen. Sie legen die Projektionsmatrix fest, indem Sie die IDirect3DDevice9::SetTransform-Methode aufrufen, den D3DTS_PROJECTION Wert verwenden und eine D3DMATRIX-Struktur übergeben, die die gewünschte Matrix darstellt. Wenn die Projektionsmatrix nicht mit dieser Anforderung konform ist, werden Nebeleffekte nicht ordnungsgemäß angewendet. Ausführliche Informationen zum Erstellen einer konformen Matrix finden Sie unter Projektionstransformation (Direct3D 9).

Direct3D verwendet die derzeit festgelegte Projektionsmatrix in w-basierten Tiefenberechnungen. Daher muss eine Anwendung eine konforme Projektionsmatrix festlegen, um die gewünschten w-basierten Features zu erhalten, auch wenn die Direct3D-Transformationspipeline nicht verwendet wird.

Direct3D überprüft die vierte Spalte der Projektionsmatrix. Wenn die Koeffizienten [0,0,0,0,1] (für eine affine Projektion) sind, verwendet das System Z-basierte Tiefenwerte für Nebel. In diesem Fall müssen Sie auch die Start- und Endabstände für lineare Nebeleffekte im Gerätebereich angeben, die von 0,0 am nächsten Punkt zum Benutzer und 1,0 am weitesten entfernten Punkt reichen.

Verwenden von Pixelnebel

Führen Sie die folgenden Schritte aus, um Pixelnebel in Ihrer Anwendung zu aktivieren.

  1. Aktivieren Sie die Nebelmischung, indem Sie den D3DRS_FOGENABLE Renderzustand auf TRUE festlegen.
  2. Legen Sie die gewünschte Nebelfarbe im D3DRS_FOGCOLOR Renderzustand fest.
  3. Wählen Sie die zu verwendende Nebelformel aus, indem Sie den D3DRS_FOGTABLEMODE Renderzustand auf den entsprechenden Member des aufgezählten D3DFOGMODE-Typs festlegen.
  4. Legen Sie die Nebelparameter für den ausgewählten Nebelmodus in den zugeordneten Renderzuständen wie gewünscht fest. Dies umfasst die Start- und Endabstände für linearen Nebel und die Nebeldichte für den exponentiellen Nebelmodus.

Das folgende Beispiel zeigt, wie diese Schritte im Code aussehen können.

// 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 SetupPixelFog(DWORD Color, DWORD Mode)
{
    float Start   = 0.5f;    // For linear mode
    float End     = 0.8f;
    float Density = 0.66f;   // For exponential modes
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if( Mode == D3DFOG_LINEAR )
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

Einige Nebelparameter sind als Gleitkommawerte erforderlich, obwohl die IDirect3DDevice9::SetRenderState-Methode nur DWORD-Werte im zweiten Parameter akzeptiert. Im vorherigen Beispiel werden die Gleitkommawerte für IDirect3DDevice9::SetRenderState ohne Datenübersetzung bereitgestellt, indem die Adressen der Gleitkommavariablen in DWORD-Zeiger umgeformt und dann dereferenziert werden.

Nebeltypen