Full-Scene Antialiasing (Direct3D 9)

A antíalia de cena completa refere-se a desfocar as bordas de cada polígono na cena, pois ele é rasterizado em uma única passagem; nenhuma segunda passagem é necessária. A antaliação de cena completa, quando suportada, afeta apenas triângulos e grupos de triângulos. As linhas não podem ser suavizadas usando serviços Direct3D. A antialiasing de cena completa é feita no Direct3D usando multisampling em cada pixel. Quando o multisampling está habilitado, todas as subsamplas de um pixel são atualizadas em uma passagem, mas quando usadas para outros efeitos que envolvem várias passagens de renderização, o aplicativo pode especificar que apenas algumas subsamplas devem ser afetadas por um determinado passe de renderização. Esta última abordagem permite simulação de desfoque de movimento, efeitos de foco de profundidade de campo, desfoque de reflexão e assim por diante.

Em ambos os casos, os vários exemplos registrados para cada pixel são combinados e são enviados para a tela. Isso permite a melhoria da qualidade da imagem de antialiasing ou outros efeitos.

Antes de criar um dispositivo com o método IDirect3D9::CreateDevice , você precisa determinar se há suporte para a antialiasing de cena completa. Faça isso chamando o método IDirect3D9::CheckDeviceMultiSampleType , 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 denota o adaptador de exibição para consultar. Este exemplo usa D3DADAPTER_DEFAULT para especificar o adaptador de exibição 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 você deve perguntar sobre TRUE (multisampling) de janela inteira ou antialiasing de cena completa (FALSE). Este exemplo usa FALSE para dizer ao Direct3D que ele está perguntando sobre a antialiasing de cena completa. O último parâmetro especifica a técnica de multisampação que você deseja testar. Use um valor do tipo enumerado D3DMULTISAMPLE_TYPE . Este exemplo testa se há suporte para dois níveis de multisampação.

Se o dispositivo der suporte ao nível de multisampação 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 multisampla. 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 multisampling.

/*
* 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 multisampling, o membro SwapEffect do D3DPRESENT_PARAMETER deve ser definido como D3DSWAPEFFECT_DISCARD.

A última etapa é habilitar a antialiasing multisampling 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á multisampling aplicado a ele. Talvez você queira habilitar e desabilitar o multisampling, dependendo do que você está renderizando.

Suavização