Partilhar via


Full-Scene Antialiasing (Direct3D 9)

Antialiasing de cena completa refere-se a borrar as bordas de cada polígono na cena à medida que é rasterizado em uma única passagem; não é necessária uma segunda passagem. A suavização de cena completa, quando suportada, afeta apenas triângulos e grupos de triângulos. As linhas não podem ser suavizadas usando os serviços Direct3D. A suavização completa da cena é feita no Direct3D usando a multiamostragem em cada pixel. Quando a multiamostragem está habilitada, todas as subamostras de um pixel são atualizadas em uma passagem, mas quando usadas para outros efeitos que envolvem várias etapas de renderização, o aplicativo pode especificar que apenas algumas subamostras devem ser afetadas por uma determinada passagem de renderização. Esta última abordagem permite a simulação de distorção de movimento, profundidade de campo, desfoque de reflexo e outros efeitos semelhantes.

Em ambos os casos, as várias amostras gravadas para cada pixel são misturadas e saídas para a tela. Isso permite a melhoria da qualidade de imagem de antialiasing ou de outros efeitos.

Antes de criar um dispositivo com o método IDirect3D9::CreateDevice, é necessário determinar se o antialiasing de cena completa é suportado. Faça isso chamando o IDirect3D9::CheckDeviceMultiSampleType método, conforme mostrado no exemplo de código abaixo.

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

O primeiro parâmetro que IDirect3D9::CheckDeviceMultiSampleType aceita é um número ordinal que indica o adaptador de vídeo a ser consultado. Este exemplo usa D3DADAPTER_DEFAULT para especificar o adaptador de vídeo primário. O segundo parâmetro é um valor do tipo enumerado D3DDEVTYPE, especificando o tipo de dispositivo. O terceiro parâmetro especifica o formato da superfície. O quarto parâmetro informa ao Direct3D se deve perguntar sobre multiamostragem de janela inteira (TRUE) ou antialiasing de cena completa (FALSE). Este exemplo usa FALSE para informar ao Direct3D que está a perguntar sobre antialiasing de cena completa. O último parâmetro especifica a técnica de amostragem múltipla que você deseja testar. Use um valor do D3DMULTISAMPLE_TYPE tipo enumerado. Este exemplo testa para ver se dois níveis de multiamostragem são suportados.

Se o dispositivo suportar o nível de multiamostragem que você deseja usar, a próxima etapa é definir os parâmetros de apresentação preenchendo os membros apropriados da estrutura D3DPRESENT_PARAMETERS para criar uma superfície de renderização de várias amostras. Depois disso, você pode criar o dispositivo. O código de exemplo abaixo mostra como configurar um dispositivo com uma superfície de renderização de várias amostras.

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

Para usar a amostragem múltipla, o membro SwapEffect do D3DPRESENT_PARAMETER deve ser definido como D3DSWAPEFFECT_DISCARD.

O último passo é ativar o antialiasing de multiamostragem chamando o método IDirect3DDevice9::SetRenderState e definindo o D3DRS_MULTISAMPLEANTIALIAS como TRUE. Depois de definir esse valor como TRUE, qualquer renderização que você fizer terá várias amostragens aplicadas a ela. Talvez você queira habilitar e desabilitar a multiamostragem, dependendo do que estiver renderizando.

Antialiasing