Udostępnij za pośrednictwem


Full-Scene antialiasing (Direct3D 9)

Antyaliasing pełnej sceny polega na rozmywaniu krawędzi każdego wielokąta w scenie podczas jednego przebiegu; nie wymaga drugiego przebiegu. Antyaliasing w pełnej scenie, jeśli jest obsługiwany, wpływa tylko na trójkąty i grupy trójkątów. Linie nie mogą być antyaliasowane przy użyciu usług Direct3D. Antyaliasing całostanowiskowy w trybie Direct3D odbywa się poprzez wielokrotne próbkowanie każdego piksela. Po włączeniu wieloamplingu wszystkie podample piksela są aktualizowane w jednym przebiegu, ale w przypadku innych efektów obejmujących wiele przebiegów renderowania aplikacja może określić, że tylko niektóre podample mają mieć wpływ na daną passę renderowania. To drugie podejście umożliwia symulację rozmycia ruchu, efektów głębi ostrości, rozmycia odbicia itd.

W obu przypadkach różne próbki zarejestrowane dla każdego piksela są łączone razem i wyświetlane na ekranie. To umożliwia lepszą jakość obrazu dzięki antyaliasingowi lub innym efektom.

Przed utworzeniem urządzenia za pomocą metody IDirect3D9::CreateDevice należy określić, czy obsługiwany jest pełnoekranowy antyaliasing. W tym celu wywołaj metodę IDirect3D9::CheckDeviceMultiSampleType, jak pokazano w poniższym przykładzie kodu.

/*
* The code below assumes that pD3D is a valid pointer 
*   to a IDirect3D9 interface.
*/

if( SUCCEEDED(pD3D->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT, 
                    D3DDEVTYPE_HAL , D3DFMT_R8G8B8, FALSE, 
                    D3DMULTISAMPLE_2_SAMPLES, NULL ) ) )
// Full-scene antialiasing is supported. Enable it here.

Pierwszy parametr, który akceptuje IDirect3D9::CheckDeviceMultiSampleType, to numer porządkowy określający adapter wyświetlania, który ma zostać sprawdzony. W tym przykładzie użyto D3DADAPTER_DEFAULT do określenia podstawowego adaptera wyświetlania. Drugi parametr jest wartością z typu D3DDEVTYPE wyliczonego, określając typ urządzenia. Trzeci parametr określa format powierzchni. Czwarty parametr informuje Direct3D, czy zapytać o multisampling w trybie pełnoekranowym (TRUE) lub antyaliasing pełnoekranowy (FALSE). W tym przykładzie użyto FALSE, aby zasygnalizować Direct3D zapytanie o antyaliasing pełnoekranowy. Ostatni parametr określa technikę wieloprzykładową, którą chcesz przetestować. Użyj wartości z typu D3DMULTISAMPLE_TYPE wyliczonego. Ten przykład sprawdza, czy obsługiwane są dwa poziomy wielopróbkowania.

Jeśli urządzenie obsługuje poziom wielokrotnego próbkowania, którego chcesz użyć, następnym krokiem jest ustawienie parametrów prezentacji przez wypełnienie odpowiednich elementów członkowskich struktury D3DPRESENT_PARAMETERS w celu utworzenia powierzchni renderowania z wielokrotnym próbkowaniem. Następnie możesz utworzyć urządzenie. Poniższy przykładowy kod pokazuje, jak skonfigurować urządzenie z powierzchnią renderowania wieloprzykładowego.

/*
* The example below assumes that pD3D is a valid pointer 
* to a IDirect3D9 interface, d3dDevice is a pointer to a 
* IDirect3DDevice9 interface, and hWnd is a valid handle
* to a window.
*/

D3DPRESENT_PARAMETER d3dPP
ZeroMemory( &d3dPP, sizeof( d3dPP ) );
d3dPP.Windowed        = FALSE
d3dPP.SwapEffect      = D3DSWAPEFFECT_DISCARD;
d3dPP.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    &d3dpp, &d3dDevice)

Aby użyć multisamplingu, człon SwapEffect D3DPRESENT_PARAMETER musi być ustawiony na D3DSWAPEFFECT_DISCARD.

Ostatnim krokiem jest włączenie wieloprzykładowego antyaliasingu poprzez wywołanie metody IDirect3DDevice9::SetRenderState i ustawienie D3DRS_MULTISAMPLEANTIALIAS na TRUE. Po ustawieniu tej wartości na TRUE, wszystkie renderowania będą miały zastosowane wieloprzykładowe próbkowanie. Możesz chcieć włączać i wyłączać multisampling, w zależności od tego, co renderujesz.

Antyaliasing