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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 !
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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)






