Intro :
Dans une application graphique, les objets du rendu peuvent subir ce qu’on appelle un « crénelage » ou un « aliasing » en anglais.
Il apparaît comme un escalier autour de la ligne affichée.
La ligne du bas représente la correction de l’effet d’escalier de la ligne du haut.
Prérequis :
– Savoir initialiser DirectX 10.1
Explications :
Cinquième partie :
Par défaut, DirectX 10.1 gère un type d’anticrénelage nommé Multisample anti-aliasing (MSAA)
1) L’anti-aliasing activé :
1) L’anti-aliasing désactivé :
Comment activer le multi-sampling dans le code ?
Lors de l’appel à D3D10CreateDeviceAndSwapChain il faut spécifier dans la structure DXGI_SWAP_CHAIN_DESC :
DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 1; sd.BufferDesc.Width = m_iWidth; sd.BufferDesc.Height = m_iHeight; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 0; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = m_hWnd; //----------------------------------// /* On indique le nombre d'échantillons de l'anti-aliasing */ sd.SampleDesc.Count = m_iFSAASampleCount; /* On indique le niveau de qualité de l'anti-aliasing */ sd.SampleDesc.Quality = 0; //----------------------------------// // Fenêtré ou non sd.Windowed = !m_bFullscreen; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
Il reste deux étapes à ne pas oublier d’effectuer :
1) Effectuer la même configuration que précédemment, lors la création de la texture du deph-stencil :
Il faut spécifier la même configuration que précédemment, sinon cela ne fonctionnera pas !
D3D10_TEXTURE2D_DESC descDepth; ZeroMemory(&descDepth, sizeof(descDepth)); descDepth.Width = m_iWidth; descDepth.Height = m_iHeight; descDepth.MipLevels = 1; descDepth.ArraySize = 1; descDepth.Format = DXGI_FORMAT_D32_FLOAT; //----------------------------------// /* On indique le nombre d'échantillons de l'anti-aliasing */ descDepth.SampleDesc.Count = m_iFSAASampleCount; /* On indique le niveau de qualité de l'anti-aliasing */ descDepth.SampleDesc.Quality = 0; //----------------------------------// descDepth.Usage = D3D10_USAGE_DEFAULT; descDepth.BindFlags = D3D10_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; m_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &m_pDepthStencil);
2) Effectuer une certaine configuration lors la création de la DepthStencilView :
D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;
descDSV.Format = descDepth.Format;
if (m_iFSAALevel > 1)
{
descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2DMS;
}
else
{
descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D;
}
descDSV.Texture2D.MipSlice = 0;
m_pd3dDevice->CreateDepthStencilView(m_pDepthStencil, &descDSV, &m_pDepthStencilView);
Voici une fonction qui permet d’afficher les capacités possibles de votre carte graphique en matière d’anti-aliasing.
Il faut obtenir le nombre d’échantillons m_iFSAASampleCount par ce bais :
void PrintFSAACapabilities()
{
HRESULT hr = S_OK;
UINT maxQualityLevel = 1;
for (UINT iSampleCount = 1; iSampleCount <= D3D10_MAX_MULTISAMPLE_SAMPLE_COUNT; iSampleCount++)
{
hr = m_pd3dDevice->CheckMultisampleQualityLevels(
DXGI_FORMAT_R8G8B8A8_UNORM, iSampleCount, &maxQualityLevel);
if (hr != S_OK)
{
std::cout << "CheckMultisampleQualityLevels a échouee." << std::endl;
}
if (maxQualityLevel > 0)
{
std::cout << "MSAA " << iSampleCount << ("X supportee par la carte vidéo avec ") <<
maxQualityLevel << " niveau(x) de qualite." << std::endl;
}
}
}
Résumé :
Nous avons présenté comment procéder pour afficher dans DirectX 10 les différents niveaux d’anticrénélages possibles par la carte vidéo et comment les activer.
Références :
– Windows DirectX Graphics Documentation (SDK June 2010)





