Suavização Full-Scene (Direct3D 9)

Suavização de cena completa refere-se a desfocar as bordas de cada polígono na cena, pois ela é rasterizada em uma única passagem; nenhuma segunda passagem é necessária. A suavização de cena completa, quando compatível, afeta apenas triângulos e grupos de triângulos. As linhas não podem ser suavizadas usando serviços Direct3D. A suavização de cena completa é feita no Direct3D usando várias amostras em cada pixel. Quando o multisampling está habilitado, todas as subamostras 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 subamostras devem ser afetadas por uma determinada passagem de renderização. Essa ú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, as várias amostras registradas para cada pixel são combinadas e geradas na tela. Isso permite a qualidade aprimorada da imagem de suavização ou outros efeitos.

Antes de criar um dispositivo com o método IDirect3D9::CreateDevice , você precisa determinar se há suporte para suavização 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 indica o adaptador de exibição para consulta. 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 é necessário perguntar sobre a suavização de várias janelas completas (TRUE) ou a suavização de cena completa (FALSE). Este exemplo usa FALSE para informar ao Direct3D que ele está perguntando sobre suavização de cena completa. O último parâmetro especifica a técnica de multiamostragem que você deseja testar. Use um valor do tipo enumerado D3DMULTISAMPLE_TYPE . Este exemplo testa se há suporte para dois níveis de multisampling.

Se o dispositivo der suporte ao nível de multisampling que você deseja usar, a próxima etapa será 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 multisampling, o membro SwapEffect de D3DPRESENT_PARAMETER deve ser definido como D3DSWAPEFFECT_DISCARD.

A última etapa é habilitar a suavização de várias amostras 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 amostras aplicadas a ele. Talvez você queira habilitar e desabilitar a multiamostragem, dependendo do que você está renderizando.

Suavização