Pixel Fog (Direct3D 9)
Pixel-Nebel erhält seinen Namen aus der Tatsache, dass er pro Pixel im Gerätetreiber berechnet wird. Dies unterscheidet sich von Vertex-Nebel, der von der Pipeline bei Transformations- und Beleuchtungsberechnungen berechnet wird. Pixelnebel wird manchmal als Tabellennebel bezeichnet, da einige Treiber eine vorkalkulierte Nachschlagetabelle verwenden, um den Nebelfaktor zu bestimmen, wobei die Tiefe jedes Pixels verwendet wird, um bei Vermischungsberechnungen anzuwenden. Sie kann mit jeder Nebelformel angewendet werden, die von Elementen des D3DFOGMODE aufgezählten Typs identifiziert wird. Die Implementierungen dieser Formeln sind treiberspezifisch. Wenn ein Treiber keine komplexe Nebelformel unterstützt, sollte er zu einer weniger komplexen Formel herabgestuft werden.
Eye-Relative im Vergleich zur Z-basierten Tiefe
Um nebelbezogene Grafikartefakte zu verringern, die durch ungleichmäßige Verteilung von Z-Werten in einem Tiefenpuffer verursacht werden, verwenden die meisten Hardwaregeräte augenrelative Tiefentiefe anstelle von z-basierten Tiefenwerten für Pixelnebel. Die augenrelative Tiefe ist im Wesentlichen das w-Element aus einem homogenen Koordinatensatz. Microsoft Direct3D verwendet den Kehrwert des RHW-Elements aus einer Geräteraumkoordinate, um "true w" zu reproduzieren. Wenn ein Gerät blickrelativen 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 augenrelativer Nebel unterstützt wird, verwendet das System automatisch die augenrelative Tiefe anstelle der z-basierten Tiefe, wenn die bereitgestellte Projektionsmatrix Z-Werte im Weltraum erzeugt, die w-Werten im Gerätebereich entsprechen. Sie legen die Projektionsmatrix fest, indem Sie die IDirect3DDevice9::SetTransform--Methode aufrufen, indem Sie den D3DTS_PROJECTION Wert verwenden und eine D3DMATRIX Struktur übergeben, die die gewünschte Matrix darstellt. Wenn die Projektionsmatrix nicht mit dieser Anforderung kompatibel ist, werden Nebeleffekte nicht ordnungsgemäß angewendet. Ausführliche Informationen zum Erstellen einer kompatiblen Matrix finden Sie unter Projection Transform (Direct3D 9).
Direct3D verwendet die derzeit festgelegte Projektionsmatrix in den w-basierten Tiefenberechnungen. Daher muss eine Anwendung eine kompatible Projektionsmatrix festlegen, um die gewünschten w-basierten Features zu erhalten, auch wenn sie die Direct3D-Transformationspipeline nicht verwendet.
Direct3D überprüft die vierte Spalte der Projektionsmatrix. Wenn die Koeffizienten [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äteraum angeben, die von 0,0 am nächsten Punkt zum Benutzer und 1,0 am weitesten entfernten Punkt reichen.
Verwenden von Pixel Fog
Führen Sie die folgenden Schritte aus, um Pixelnebel in Ihrer Anwendung zu aktivieren.
- Aktivieren Sie die Nebelmischung, indem Sie den D3DRS_FOGENABLE Renderzustand auf TRUEfestlegen.
- Legen Sie die gewünschte Nebelfarbe im D3DRS_FOGCOLOR Renderzustand fest.
- Wählen Sie die zu verwendende Nebelformel aus, indem Sie den D3DRS_FOGTABLEMODE Renderzustand auf das entsprechende Element des D3DFOGMODE aufgezählten Typs festlegen.
- Legen Sie die Nebelparameter für den ausgewählten Nebelmodus in den zugeordneten Renderzuständen wie gewünscht fest. Dazu gehören 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 IDirect3DDevice9::SetRenderState ohne Datenübersetzung bereitgestellt, indem die Adressen der Gleitkommavariablen als DWORD-Zeiger umgeleitet und anschließend abgeleitet werden.
Verwandte Themen