Mgła wierzchołka (Direct3D 9)
Gdy system wykonuje mgły wierzchołków, stosuje obliczenia mgły w każdym wierzchołku w wielokącie, a następnie interpoluje wyniki na powierzchni wielokąta podczas rasteryzacji. Efekty mgły wierzchołków są obliczane przez aparat oświetlenia Direct3D i transformacji. Aby uzyskać więcej informacji, zobacz Parametry mgły (Direct3D 9).
Jeśli aplikacja nie używa funkcji Direct3D do przekształcania i oświetlenia, aplikacja musi wykonywać obliczenia mgły. W tym przypadku umieść współczynnik mgły obliczony w składniku alfa koloru widmowego dla każdego wierzchołka. Możesz używać dowolnych formuł — opartych na zakresie, woluminowych lub w inny sposób. Funkcja Direct3D używa dostarczonego współczynnika mgły do interpolacji w całej powierzchni każdego wielokąta. Aplikacje, które wykonują własną transformację i oświetlenie, muszą również wykonywać własne obliczenia mgły wierzchołków. W związku z tym aplikacja musi włączyć tylko mieszanie mgły i ustawić kolor mgły przez skojarzone stany renderowania, zgodnie z opisem w Fog Blending (Direct3D 9) i Fog Color (Direct3D 9).
Nuta
W przypadku korzystania z cieniowania wierzchołków należy użyć mgły wierzchołka. Jest to realizowane przy użyciu cieniowania wierzchołków do zapisu intensywności mgły na wierzchołki do rejestru oFog. Po zakończeniu cieniowania pikseli dane oFog są używane do interpolacji liniowej z kolorem mgły. Ta intensywność nie jest dostępna w cieniatorze pikseli.
mgła Range-Based
Nuta
Funkcja Direct3D używa obliczeń mgły opartych na zakresie tylko w przypadku używania mgły wierzchołka z przekształceniem Direct3D i aparatem oświetlenia. Wynika to z faktu, że mgła pikseli jest implementowana w sterowniku urządzenia i obecnie nie istnieje sprzęt obsługujący mgłę opartą na zakresie pikseli. Jeśli aplikacja wykonuje własną transformację i oświetlenie, musi wykonywać własne obliczenia mgły, oparte na zakresie lub w inny sposób.
Czasami użycie mgły może wprowadzać artefakty graficzne, które powodują mieszanie obiektów z kolorem mgły w sposób nieintuicyjny. Załóżmy na przykład, że scena, w której istnieją dwa widoczne obiekty: jeden wystarczająco odległy, aby mieć wpływ mgły, a drugi wystarczająco blisko, aby nie mieć wpływu. Jeśli obszar wyświetlania obraca się na miejscu, widoczne efekty mgły mogą ulec zmianie, nawet jeśli obiekty są nieruchome. Na poniższym diagramie przedstawiono widok od góry do dołu takiej sytuacji.
Mgła oparta na zasięgu to kolejny, dokładniejszy sposób określania efektów mgły. W mgle opartej na zakresie funkcja Direct3D używa rzeczywistej odległości od punktu widzenia do wierzchołka dla obliczeń mgły. Direct3D zwiększa efekt mgły w miarę wzrostu odległości między dwoma punktami, a nie głębokości wierzchołka w scenie, unikając w ten sposób artefaktów obrotowych.
Jeśli bieżące urządzenie obsługuje mgłę opartą na zakresie, ustawi wartość D3DPRASTERCAPS_FOGRANGE w elemencie członkowskim RasterCaps D3DCAPS9 podczas wywoływania metody IDirect3DDevice9::GetDeviceCaps. Aby włączyć mgłę opartą na zakresie, ustaw stan renderowania D3DRS_RANGEFOGENABLE na TRUE.
Mgła oparta na zakresie jest obliczana przez direct3D podczas transformacji i oświetlenia. Aplikacje, które nie korzystają z transformacji Direct3D i aparatu oświetlenia, muszą również wykonywać własne obliczenia mgły wierzchołków. W tym przypadku należy podać współczynnik mgły oparty na zakresie w składniku alfa składnika widmowego dla każdego wierzchołka.
Używanie mgły wierzchołka
Wykonaj poniższe kroki, aby włączyć mgłę wierzchołka w aplikacji.
- Włącz mieszanie mgły, ustawiając D3DRS_FOGENABLE true.
- Ustaw kolor mgły w stanie renderowania D3DRS_FOGCOLOR.
- Wybierz żądaną formułę mgły, ustawiając stan renderowania D3DRS_FOGVERTEXMODE na element członkowski typu D3DFOGMODE wyliczonego.
- Ustaw parametry mgły zgodnie z potrzebami dla wybranej formuły mgły w stanach renderowania.
Poniższy przykład napisany w języku C++pokazuje, 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 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);
}
Niektóre parametry mgły są wymagane jako wartości zmiennoprzecinkowe, mimo że IDirect3DDevice9::SetRenderState metoda akceptuje tylko wartości DWORD w drugim parametrze. Ten przykład pomyślnie dostarcza wartości zmiennoprzecinkowe do tych metod bez tłumaczenia danych przez rzutowanie adresów zmiennych zmiennoprzecinkowych jako wskaźników DWORD, a następnie wyłuszanie ich.
Tematy pokrewne