Freigeben über


Vertex-Nebel (Direct3D 9)

Wenn das System Vertex-Nebelung durchführt, wendet es Nebelberechnungen an jedem Scheitelpunkt in einem Polygon an und interpoliert dann die Ergebnisse während der Rasterung über die Oberfläche des Polygons. Vertex-Nebeleffekte werden vom Direct3D-Beleuchtungs- und Transformationsmodul berechnet. Weitere Informationen finden Sie unter Fog Parameters (Direct3D 9).

Wenn Ihre Anwendung Direct3D nicht für Transformation und Beleuchtung verwendet, muss die Anwendung Nebelberechnungen durchführen. Platzieren Sie in diesem Fall den Nebelfaktor, der in der Alphakomponente der Glanzfarbe für jeden Scheitelpunkt berechnet wird. Sie können beliebige Formeln verwenden – bereichsbasierte, volumetrische oder anderweitige Formeln. Direct3D verwendet den bereitgestellten Nebelfaktor, um über das Gesicht jedes Polygons interpolieren zu können. Anwendungen, die ihre eigene Transformation und Beleuchtung durchführen, müssen auch eigene Vertex-Nebelberechnungen durchführen. Daher muss eine solche Anwendung nur die Nebelmischung aktivieren und die Nebelfarbe durch die zugeordneten Renderzustände festlegen, wie in Fog Blending (Direct3D 9) und Fog Color (Direct3D 9)beschrieben.

Anmerkung

Bei Verwendung eines Vertex-Shaders müssen Sie Vertex-Nebel verwenden. Dazu wird der Vertex-Shader verwendet, um die Intensität des Nebels pro Scheitelpunkt in das oFog-Register zu schreiben. Nach Abschluss des Pixelshaders werden die oFog-Daten verwendet, um linear mit der Nebelfarbe zu interpolieren. Diese Intensität ist in einem Pixelshader nicht verfügbar.

 

Range-Based Nebel

Anmerkung

Direct3D verwendet bereichsbasierte Nebelberechnungen nur bei Verwendung von Vertex-Nebel mit der Direct3D-Transformation und dem Beleuchtungsmodul. Dies liegt daran, dass Pixelnebel im Gerätetreiber implementiert ist und derzeit keine Hardware vorhanden ist, um pro Pixelbereichsbasiertem Nebel zu unterstützen. Wenn Ihre Anwendung eine eigene Transformation und Beleuchtung durchführt, muss sie eigene Nebelberechnungen, bereichsbasiert oder anderweitig durchführen.

 

Manchmal kann die Verwendung von Nebel Grafikartefakten einführen, die dazu führen, dass Objekte auf unintuitive Weise mit der Nebelfarbe vermischt werden. Stellen Sie sich beispielsweise eine Szene vor, in der zwei sichtbare Objekte vorhanden sind: eine entfernt genug, um von Nebel betroffen zu sein, und der andere nahe genug, um nicht betroffen zu sein. Wenn sich der Sichtbereich an Ort dreht, können sich die scheinbaren Nebeleffekte ändern, auch wenn die Objekte stationär sind. Das folgende Diagramm zeigt eine Top-Down-Ansicht einer solchen Situation.

Diagramm zweier Standpunkte und wie sie sich auf Nebel für zwei Objekte auswirken

Bereichsbasierter Nebel ist eine weitere, genauere Methode, um die Nebeleffekte zu bestimmen. Im bereichsbasierten Nebel verwendet Direct3D den tatsächlichen Abstand vom Standpunkt zu einem Scheitelpunkt für seine Nebelberechnungen. Direct3D erhöht den Effekt des Nebels, da der Abstand zwischen den beiden Punkten steigt, anstatt die Tiefe des Scheitelpunkts innerhalb der Szene, wodurch Drehungsartefakte vermieden werden.

Wenn das aktuelle Gerät bereichsbasierten Nebel unterstützt, wird der D3DPRASTERCAPS_FOGRANGE Wert im RasterCaps-Element von D3DCAPS9 festgelegt, wenn Sie die IDirect3DDevice9::GetDeviceCaps-Methode aufrufen. Um bereichsbasierten Nebel zu aktivieren, legen Sie den D3DRS_RANGEFOGENABLE Renderzustand auf TRUEfest.

Bereichsbasierter Nebel wird von Direct3D während der Transformation und Beleuchtung berechnet. Anwendungen, die die Direct3D-Transformation und beleuchtungsmodul nicht verwenden, müssen auch eigene Vertex-Nebelberechnungen durchführen. Geben Sie in diesem Fall den bereichsbasierten Nebelfaktor in der Alphakomponente der Glanzkomponente für jeden Scheitelpunkt an.

Verwenden von Vertex-Nebel

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

  1. Aktivieren Sie die Nebelmischung, indem Sie D3DRS_FOGENABLE auf TRUE-festlegen.
  2. Legen Sie die Nebelfarbe im D3DRS_FOGCOLOR Renderzustand fest.
  3. Wählen Sie die gewünschte Nebelformel aus, indem Sie den D3DRS_FOGVERTEXMODE Renderzustand auf ein Element des D3DFOGMODE Aufzählungstyps festlegen.
  4. Legen Sie die Nebelparameter für die ausgewählte Nebelformel in den Renderzuständen wie gewünscht fest.

Im folgenden In C++ geschriebenen Beispiel wird gezeigt, 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 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);
}

Einige Nebelparameter sind als Gleitkommawerte erforderlich, obwohl die IDirect3DDevice9::SetRenderState Methode nur DWORD-Werte im zweiten Parameter akzeptiert. In diesem Beispiel werden die Gleitkommawerte ohne Datenübersetzung erfolgreich bereitgestellt, indem sie die Adressen der Gleitkommavariablen als DWORD-Zeiger umwandeln und diese dann ableiten.

Nebeltypen