Condividi tramite


Full-Scene antialiasing (Direct3D 9)

L'anti-aliasing completo della scena si riferisce all'attenuazione dei bordi di ogni poligono nella scena durante la rasterizzazione in un unico passaggio; non è necessario alcun secondo passaggio. L'anti-aliasing della scena completa, se supportato, influisce solo su triangoli e gruppi di triangoli. Le righe non possono essere antialiasate tramite i servizi Direct3D. L'anti-aliasing della scena completa viene eseguito in Direct3D usando il multicampionamento su ogni pixel. Quando è abilitato il multicampionamento, tutti i sottocampionamento di un pixel vengono aggiornati in un unico passaggio, ma quando vengono usati per altri effetti che coinvolgono più passaggi di rendering, l'applicazione può specificare che solo alcuni subcampionamento devono essere interessati da un determinato passaggio di rendering. Questo secondo approccio consente la simulazione della sfocatura del movimento, degli effetti di messa a fuoco della profondità di campo, della sfocatura del riflesso e così via.

In entrambi i casi, i vari campioni registrati per ogni pixel vengono combinati e restituiti sullo schermo. In questo modo è possibile migliorare la qualità dell'immagine dell'antialiasing o di altri effetti.

Prima di creare un dispositivo con il metodo IDirect3D9::CreateDevice, è necessario determinare se è supportato l'antialiasing full-scene. A tale scopo, chiamare il metodo IDirect3D9::CheckDeviceMultiSampleType come illustrato nell'esempio di codice seguente.

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

Il primo parametro che IDirect3D9::CheckDeviceMultiSampleType accetta è un numero ordinale che indica l'adattatore di visualizzazione su cui eseguire la query. Questo esempio usa D3DADAPTER_DEFAULT per specificare l'adattatore grafico principale. Il secondo parametro è un valore del tipo enumerato D3DDEVTYPE, specificando il tipo di dispositivo. Il terzo parametro specifica il formato della superficie. Il quarto parametro indica a Direct3D se chiedere informazioni sul multicampionamento a tutto schermo (TRUE) o sull'anti-aliasing su tutta la scena (FALSE). Questo esempio usa FALSE per indicare a Direct3D che richiede informazioni sull'anti-aliasing sull'intera scena. L'ultimo dei parametri specifica la tecnica di multicampionamento che desideri testare. Usare un valore del tipo enumerato D3DMULTISAMPLE_TYPE. Questo esempio verifica se sono supportati due livelli di multicampionamento.

Se il dispositivo supporta il livello di multicampionamento da usare, il passaggio successivo consiste nell'impostare i parametri di presentazione compilando i membri appropriati della struttura D3DPRESENT_PARAMETERS per creare una superficie di rendering multisample. Successivamente, è possibile creare il dispositivo. Il codice di esempio seguente illustra come configurare un dispositivo con una superficie di rendering a multicampionamento.

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

Per utilizzare il multicampionamento, il membro SwapEffect di D3DPRESENT_PARAMETER deve essere impostato su D3DSWAPEFFECT_DISCARD.

L'ultimo passaggio consiste nell'abilitare l'antialiasing multicampionamento chiamando il metodo IDirect3DDevice9::SetRenderState e impostando il D3DRS_MULTISAMPLEANTIALIAS su TRUE. Dopo aver impostato questo valore su TRUE, qualsiasi rendering che eseguirai avrà il multicampionamento applicato. Potresti voler abilitare o disabilitare il multicampionamento, a seconda di ciò che stai renderizzando.

antialiasing