Scheitelpunktnebel (Direct3D 9)
Wenn das System vertex Fogging durchführt, wendet es Nebelberechnungen an jedem Scheitelpunkt in einem Polygon an und interpoliert die Ergebnisse dann während der Rasterung über die Fläche des Polygons. Vertexnebeleffekte werden von der Direct3D-Engine für Beleuchtung und Transformation berechnet. Weitere Informationen finden Sie unter Nebelparameter (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 spiegelförmigen Farbe für jeden Scheitelpunkt berechnet wird. Sie können alle gewünschten Formeln verwenden – bereichsbasiert, volumetrische oder andere. Direct3D verwendet den bereitgestellten Nebelfaktor, um die Fläche jedes Polygons zu interpolieren. 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 über die zugehörigen Renderzustände festlegen, wie unter Fog Blending (Direct3D 9) und Fog Color (Direct3D 9) beschrieben.
Hinweis
Wenn Sie einen Vertex-Shader verwenden, müssen Sie Scheitelpunktnebel verwenden. Dies wird erreicht, indem der Vertex-Shader verwendet wird, um die Nebelintensität pro Vertex in das oFog-Register zu schreiben. Nach Abschluss des Pixel-Shaders werden die oFog-Daten verwendet, um linear mit der Nebelfarbe zu interpolieren. Diese Intensität ist in einem Pixel-Shader nicht verfügbar.
Range-Based Nebel
Hinweis
Direct3D verwendet bereichsbasierte Nebelberechnungen nur bei Verwendung von Scheitelpunktnebel mit der Direct3D-Transformations- und Beleuchtungs-Engine. Dies liegt daran, dass Pixelnebel im Gerätetreiber implementiert ist und derzeit keine Hardware vorhanden ist, um den pro Pixelbereich basierenden Nebel zu unterstützen. Wenn Ihre Anwendung eine eigene Transformation und Beleuchtung durchführt, muss sie eigene Nebelberechnungen durchführen, bereichsbasiert oder anderweitig.
Manchmal kann die Verwendung von Nebel grafische Artefakte verursachen, die dazu führen, dass Objekte auf unintuitive Weise mit der Nebelfarbe gemischt werden. Stellen Sie sich beispielsweise eine Szene vor, in der es zwei sichtbare Objekte gibt: eines weit genug, um von Nebel beeinflusst zu werden, und das andere fast genug, um nicht betroffen zu sein. Wenn sich der Sichtbereich an Ort und Stelle 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.
Bereichsbasierter Nebel ist eine weitere, genauere Möglichkeit, die Nebeleffekte zu bestimmen. Bei bereichsbasiertem Nebel verwendet Direct3D den tatsächlichen Abstand vom Standpunkt zu einem Scheitelpunkt für seine Nebelberechnungen. Direct3D erhöht die Auswirkung von Nebel, wenn der Abstand zwischen den beiden Punkten zunimmt, anstatt die Tiefe des Scheitelpunkts in der Szene, wodurch Rotationsartefakte vermieden werden.
Wenn das aktuelle Gerät bereichsbasierten Nebel unterstützt, wird der D3DPRASTERCAPS_FOGRANGE-Wert im RasterCaps-Member von D3DCAPS9 festgelegt, wenn Sie die IDirect3DDevice9::GetDeviceCaps-Methode aufrufen. Um bereichsbasierten Nebel zu aktivieren, legen Sie den D3DRS_RANGEFOGENABLE Renderzustand auf TRUE fest.
Bereichsbasierter Nebel wird von Direct3D während der Transformation und Beleuchtung berechnet. Anwendungen, die die Direct3D-Transformations- und Beleuchtungs-Engine nicht verwenden, müssen auch eigene Vertex-Nebelberechnungen durchführen. Geben Sie in diesem Fall den bereichsbasierten Nebelfaktor in der Alphakomponente der spekulären Komponente für jeden Scheitelpunkt an.
Verwenden von Scheitelpunktnebel
Führen Sie die folgenden Schritte aus, um Scheitelpunktnebel in Ihrer Anwendung zu aktivieren.
- Aktivieren Sie die Nebelmischung, indem Sie D3DRS_FOGENABLE auf TRUE festlegen.
- Legen Sie die Nebelfarbe im D3DRS_FOGCOLOR Renderzustand fest.
- Wählen Sie die gewünschte Nebelformel aus, indem Sie den D3DRS_FOGVERTEXMODE Renderzustand auf ein Element des aufgezählten D3DFOGMODE-Typs festlegen.
- Legen Sie die Nebelparameter für die ausgewählte Nebelformel in den Renderzuständen wie gewünscht fest.
Das folgende In C++ geschriebene 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 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 für diese Methoden ohne Datenübersetzung erfolgreich bereitgestellt, indem die Adressen der Gleitkommavariablen als DWORD-Zeiger umgeformt und dann deferenciert werden.
Zugehörige Themen