Full-Scene Antialiasing (Direct3D 9)

Full-Scene-Antialiasing bezieht sich auf das Verwischen der Kanten jedes Polygons in der Szene, da es in einem einzigen Durchgang gerastert wird; es ist kein zweiter Durchgang erforderlich. Vollständiges Antialiasing wirkt sich, sofern unterstützt, nur auf Dreiecke und Gruppen von Dreiecken aus. Zeilen können nicht mithilfe von Direct3D-Diensten antialiasiert werden. Vollständiges Antialiasing erfolgt in Direct3D mithilfe von Multisampling für jedes Pixel. Wenn multisampling aktiviert ist, werden alle Untersamples eines Pixels in einem Durchlauf aktualisiert. Wenn sie jedoch für andere Effekte verwendet wird, die mehrere Renderingdurchläufe umfassen, kann die Anwendung angeben, dass nur einige Untersamples von einem bestimmten Renderingdurchlauf betroffen sein sollen. Dieser letztere Ansatz ermöglicht die Simulation von Bewegungsunschärfe, Tiefenschärfeneffekten, Reflektionsunschärfe usw.

In beiden Fällen werden die verschiedenen Stichproben, die für jedes Pixel aufgezeichnet wurden, zusammengeführt und auf dem Bildschirm ausgegeben. Dies ermöglicht die verbesserte Bildqualität von Antialiasing oder anderen Effekten.

Bevor Sie ein Gerät mit der IDirect3D9::CreateDevice-Methode erstellen, müssen Sie ermitteln, ob vollständiges Antialiasing unterstützt wird. Rufen Sie hierzu die IDirect3D9::CheckDeviceMultiSampleType-Methode auf, wie im folgenden Codebeispiel gezeigt.

/*
* 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.

Der erste Parameter, den IDirect3D9::CheckDeviceMultiSampleType akzeptiert, ist eine Ordnungszahl, die den abzufragenden Anzeigeadapter angibt. In diesem Beispiel wird D3DADAPTER_DEFAULT verwendet, um den primären Grafikkarte anzugeben. Der zweite Parameter ist ein Wert aus dem aufgezählten D3DDEVTYPE-Typ , der den Gerätetyp angibt. Der dritte Parameter gibt das Format der Oberfläche an. Der vierte Parameter teilt Direct3D mit, ob sie sich nach Vollfenster-Multisampling (TRUE) oder Full-Scene-Antialiasing (FALSE) erkundigen soll. In diesem Beispiel wird FALSE verwendet, um Direct3D mitzuteilen, dass es sich um die Vollständige Antialiasing-Szene erfragt. Der letzte Parameter gibt das Multisampling-Verfahren an, das Sie testen möchten. Verwenden Sie einen Wert aus dem D3DMULTISAMPLE_TYPE aufgezählten Typ. In diesem Beispiel wird getestet, ob zwei Ebenen von Multisampling unterstützt werden.

Wenn das Gerät die Ebene der Multisampling unterstützt, die Sie verwenden möchten, besteht der nächste Schritt darin, die Präsentationsparameter festzulegen, indem Sie die entsprechenden Elemente der D3DPRESENT_PARAMETERS-Struktur ausfüllen, um eine Multisampel-Renderingoberfläche zu erstellen. Danach können Sie das Gerät erstellen. Der folgende Beispielcode zeigt, wie Sie ein Gerät mit einer Multisampling-Renderoberfläche einrichten.

/*
* 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)

Um Multisampling zu verwenden, muss der SwapEffect-Member von D3DPRESENT_PARAMETER auf D3DSWAPEFFECT_DISCARD festgelegt werden.

Der letzte Schritt besteht darin, multisampling-Antialiasing zu aktivieren, indem Sie die IDirect3DDevice9::SetRenderState-Methode aufrufen und die D3DRS_MULTISAMPLEANTIALIAS auf TRUE festlegen. Nachdem Sie diesen Wert auf TRUE festgelegt haben, wird für jedes Rendering, das Sie tun, Multisampling angewendet. Sie können multisampling aktivieren und deaktivieren, je nachdem, was Sie rendern.

Antialiasing