Mgła pikseli (Direct3D 9)
Mgła pikseli pobiera swoją nazwę od faktu, że jest obliczany na podstawie pikseli w sterowniku urządzenia. Różni się to od mgły wierzchołka, która jest obliczana przez potok podczas obliczeń przekształcania i oświetlenia. Mgła pikseli jest czasami nazywana mgłą tabeli, ponieważ niektórzy kierowcy używają wstępnie obliczonej tabeli odnośników w celu określenia współczynnika mgły przy użyciu głębokości każdego piksela do zastosowania w obliczeniach mieszanych. Można go stosować przy użyciu dowolnej formuły mgły identyfikowanej przez elementy członkowskie typu D3DFOGMODE wyliczonego. Implementacje tych formuł są specyficzne dla sterownika. Jeśli sterownik nie obsługuje złożonej formuły mgły, powinien zmniejszyć wydajność do mniej złożonej formuły.
Eye-Relative a głębokość oparta na Z
Aby złagodzić artefakty graficzne związane z mgłą spowodowaną nierównomiernym rozkładem wartości z w buforze głębokości, większość urządzeń sprzętowych używa głębokości względnej oczu zamiast wartości głębokości opartej na z dla mgły pikseli. Głębokość względna oczu jest zasadniczo elementem w z homogenicznego zestawu współrzędnych. Usługa Microsoft Direct3D przyjmuje wzajemny element RHW ze współrzędnych przestrzeni urządzenia ustawioną na odtworzenie wartości true w. Jeśli urządzenie obsługuje mgłę względną do oczu, ustawia flagę D3DPRASTERCAPS_WFOG w elemencie członkowskim RasterCaps struktury D3DCAPS9 podczas wywoływania metody IDirect3DDevice9::GetDeviceCaps. Z wyjątkiem rasterizatora referencyjnego, urządzenia programowe zawsze używają z do obliczania efektów mgły pikseli.
Gdy mgła względna oczu jest obsługiwana, system automatycznie używa głębokości względnej oczu, a nie głębokości opartej na z, jeśli podana macierz projekcji generuje wartości z w przestrzeni światowej, które są równoważne wartościom w przestrzeni urządzenia. Macierz projekcji można ustawić, wywołując metodę IDirect3DDevice9::SetTransform przy użyciu wartości D3DTS_PROJECTION i przekazując strukturę D3DMATRIX reprezentującą żądaną macierz. Jeśli macierz projekcji nie jest zgodna z tym wymaganiem, efekty mgły nie są stosowane prawidłowo. Aby uzyskać szczegółowe informacje na temat tworzenia zgodnej macierzy, zobacz Projekcja Transform (Direct3D 9).
Funkcja Direct3D używa obecnie ustawionej macierzy projekcji w obliczeniach głębokości opartych na w. W związku z tym aplikacja musi ustawić zgodną macierz projekcji, aby otrzymywać żądane funkcje oparte na w, nawet jeśli nie używa potoku transformacji Direct3D.
Funkcja Direct3D sprawdza czwartą kolumnę macierzy projekcji. Jeśli współczynniki są [0,0,0,1] (dla projekcji affiny), system użyje wartości głębokości na podstawie z dla mgły. W takim przypadku należy również określić odległości początkowe i końcowe dla liniowych efektów mgły w przestrzeni urządzenia, które wahają się od 0,0 w najbliższym punkcie do użytkownika i 1,0 w najbardziej odległym punkcie.
Używanie mgły pikseli
Wykonaj poniższe kroki, aby włączyć mgłę pikseli w aplikacji.
- Włącz mieszanie mgły, ustawiając stan renderowania D3DRS_FOGENABLE na true.
- Ustaw żądany kolor mgły w stanie renderowania D3DRS_FOGCOLOR.
- Wybierz formułę mgły, która ma być używana, ustawiając stan renderowania D3DRS_FOGTABLEMODE na odpowiedni element członkowski typu D3DFOGMODE wyliczonego.
- Ustaw parametry mgły zgodnie z potrzebami dla wybranego trybu mgły w skojarzonych stanach renderowania. Obejmuje to odległości początkowe i końcowe dla mgły liniowej i gęstość mgły dla trybu mgły wykładniczej.
W poniższym przykładzie pokazano, jak te kroki mogą wyglądać w kodzie.
// 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));
}
Niektóre parametry mgły są wymagane jako wartości zmiennoprzecinkowe, mimo że IDirect3DDevice9::SetRenderState metoda akceptuje tylko wartości DWORD w drugim parametrze. Powyższy przykład zawiera wartości zmiennoprzecinkowe do IDirect3DDevice9::SetRenderState bez tłumaczenia danych przez rzutowanie adresów zmiennych zmiennoprzecinkowych jako wskaźników DWORD, a następnie wyłuszczanie ich.
Tematy pokrewne