Pixelpixel (Direct3D 9)
Pixelpixel erhält ihren Namen aus der Tatsache, dass sie im Gerätetreiber auf Pixelbasis berechnet wird. Dies ist anders als scheitelpunktverwandt, das von der Pipeline bei Transformations- und Beleuchtungsberechnungen berechnet wird. Pixelpixel werden manchmal als Tabellenverschnürung bezeichnet, da einige Treiber eine vorab berechnete Nachschlagetabelle verwenden, um den Faktor zu bestimmen. Dabei wird die Tiefe der einzelnen Pixel verwendet, um sie in Mischungsberechnungen anzuwenden. Sie kann mithilfe einer beliebigen Formel angewendet werden, die von Membern des aufzählten D3DFOGMODE-Typs identifiziert wird. Die Implementierungen dieser Formeln sind treiberspezifisch. Wenn ein Treiber keine komplexe Formel unterstützt, sollte er zu einer weniger komplexen Formel herabgestuft werden.
Eye-Relative im Vergleich zur Z-basierten Tiefe
Zur Entschärfung von grafikbezogenen Artefakten, die durch ungleichmäßig verteilte Z-Werte in einem Tiefenpuffer verursacht werden, verwenden die meisten Hardwaregeräte die augenbezogene Tiefe anstelle von z-basierten Tiefenwerten für Pixelpixel. Die augen relative Tiefe ist im Wesentlichen das w-Element aus einem homogenen Koordinatensatz. Microsoft Direct3D verwendet den Kehrteil des RHW-Elements aus einer Geräteraumkoordinatensatz, um true w zu reproduzieren. Wenn ein Gerät eye-relatives Gerüst unterstützt, legt es das _ WFOG-Flag D3DPRASTERCAPS im RasterCaps-Member der D3DCAPS9-Struktur fest, wenn Sie die IDirect3DDevice9::GetDeviceCaps-Methode aufrufen. Mit Ausnahme des Referenzrasters verwenden Softwaregeräte immer z, um Pixeleffekte zu berechnen.
Wenn augenbezogene Brillen unterstützt werden, verwendet das System automatisch die augenbezogene 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, 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 Effekteffekte nicht ordnungsgemäß angewendet. Weitere Informationen zum Erstellen einer kompatiblen Matrix finden Sie unter Projektionstransformation (Direct3D 9).
Direct3D verwendet die derzeit festgelegte Projektionsmatrix in seinen w-basierten Tiefenberechnungen. Daher muss eine Anwendung eine konforme Projektionsmatrix festlegen, um die gewünschten w-basierten Features zu erhalten, auch wenn sie nicht die Direct3D-Transformationspipeline 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 Diebung. In diesem Fall müssen Sie auch die Start- und Endentfernungen für lineare Lichteffekte im Gerätebereich angeben, die von 0,0 am nächstgelegenen Punkt zum Benutzer und 1,0 am längsten Punkt reichen.
Verwenden von Pixel Pixel
Verwenden Sie die folgenden Schritte, um Pixelpixel in Ihrer Anwendung zu aktivieren.
- Aktivieren Sie das Blending von Blending, indem Sie den Renderzustand _ D3DRSUNGENABLE auf TRUE festlegen.
- Legen Sie die gewünschte Farbtonfarbe im _ D3DRS-RenderzustandCOLOR fest.
- Wählen Sie die zu verwendende Formel aus, indem Sie den Renderzustand D3DRSTABLEMODE auf den entsprechenden Member des _ aufzählten D3DFOGMODE-Typs festlegen.
- Legen Sie die Parameter für den ausgewählten Modus in den zugeordneten Renderzuständen wie gewünscht fest. Dies schließt die Start- und Endentfernungen für lineare Kurve und die Dichte der Kurve für den exponentiellen Modus ein.
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 Parameter 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 durch Umwandlung der Adressen der Gleitkommavariablen als DWORD-Zeiger und anschließendes Deferencing angegeben.