Skip to main content
GameDev.net gamedev.net
🔒 Locked

How to enable MSAA in DirectX 11

Started by jajcek Jan 21, 2013 at 12:16 PM 2 replies 30.8k views
Original Post
jajcek
jajcek

Hi,

I remember that it was quite easy to turn it on in DirectX 9.0, but unfortunately I can't make it working with DX11. The MSDN says:

"The settings of the MultisampleEnable and AntialiasedLineEnable members apply only to multisample antialiasing (MSAA) render targets (that is, render targets with sample counts greater than 1)."

therefore we can deduce that we have to change appropriate properties in the rasterizer (MultisampleEnable and AntialiasedLineEnable) and increase the SampleDesc.Count value for a render target, so my changes are like this:

main render target:


D3D11_TEXTURE2D_DESC _depthBufferDesc;
ZeroMemory( &_depthBufferDesc, sizeof( D3D11_TEXTURE2D_DESC ) );
_depthBufferDesc.Width = uScreenWidth;
_depthBufferDesc.Height = uScreenHeight;
_depthBufferDesc.MipLevels = 1;
_depthBufferDesc.ArraySize = 1;
_depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
_depthBufferDesc.SampleDesc.Count = 2; // increased value to 2
_depthBufferDesc.SampleDesc.Quality = 0;
_depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
_depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
_depthBufferDesc.CPUAccessFlags = 0;
_depthBufferDesc.MiscFlags = 0;


_result = m_device->CreateTexture2D( &_depthBufferDesc, NULL, &m_depthStencilBuffer );
if( FAILED( _result ) ) {
return false;
}

rasterizer:


D3D11_RASTERIZER_DESC _rasterDesc;
_rasterDesc.AntialiasedLineEnable = true; // changed to true
_rasterDesc.CullMode = D3D11_CULL_BACK;
_rasterDesc.DepthBias = 0;
_rasterDesc.DepthBiasClamp = 0.0f;
_rasterDesc.DepthClipEnable = true;
_rasterDesc.FillMode = D3D11_FILL_SOLID;
_rasterDesc.FrontCounterClockwise = false;
_rasterDesc.MultisampleEnable = true; // changed to true
_rasterDesc.ScissorEnable = false;
_rasterDesc.SlopeScaledDepthBias = 0.0f;


_result = m_device->CreateRasterizerState( &_rasterDesc, &m_rasterState );
if( FAILED( _result ) ) {
return false;
}

however it fails while creating depth stencil view:


D3D11_DEPTH_STENCIL_VIEW_DESC _depthStencilViewDesc;
ZeroMemory( &_depthStencilViewDesc, sizeof( D3D11_DEPTH_STENCIL_VIEW_DESC ) );
_depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
_depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
_depthStencilViewDesc.Texture2D.MipSlice = 0;


_result = m_device->CreateDepthStencilView( m_depthStencilBuffer, &_depthStencilViewDesc, &m_depthStencilView );
if( FAILED( _result ) ) {
return false;
}

why? I tried to increase the Count value in the swap chain but then I have just black screen and nothing more.

Thank you for some help.

Aqua Costa
Aqua Costa
The sample count and quality of the render target/swap chain and the depth stencil view have to be the same.
Can you post the render target/swap chain texture desc?

Is the D3D debug layer printing any warning or error message?

EDIT:

Also make sure that your GPU supports that sample count/quality pair.
Use ID3D11Device::CheckMultisampleQualityLevels Method to check support.
jajcek
jajcek

Thank you for your interest.

The sample count and quality of the render target/swap chain and the depth stencil view have to be the same.

Ok, I have changed it in swap chain to 2 as well, but it still fails.


Can you post the render target/swap chain texture desc?

render target is already posted, isn't it? (it is_depthBufferDesc, right?), the swap chain is:


DXGI_SWAP_CHAIN_DESC _swapChainDesc;
ZeroMemory( &_swapChainDesc, sizeof( DXGI_SWAP_CHAIN_DESC ) );
_swapChainDesc.BufferCount = 1;
_swapChainDesc.BufferDesc.Width = uScreenWidth;
_swapChainDesc.BufferDesc.Height = uScreenHeight;
_swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
_swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
_swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
_swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
_swapChainDesc.OutputWindow = hWnd;
_swapChainDesc.SampleDesc.Count = 2; // changed to 2
_swapChainDesc.SampleDesc.Quality = 0;
if( isFullscreen )
_swapChainDesc.Windowed = false;
else
_swapChainDesc.Windowed = true;


_result = D3D11CreateDeviceAndSwapChain( NULL,
        D3D_DRIVER_TYPE_HARDWARE,
        NULL, NULL, NULL, 0, 
        D3D11_SDK_VERSION,
        &_swapChainDesc,
        &m_swapChain,
        &m_device,
        NULL,
        &m_deviceContext );
Is the D3D debug layer printing any warning or error message?

I am getting "_com_error at memory location" in the output in VS2012

Also make sure that your GPU supports that sample count/quality pair.
Use ID3D11Device::CheckMultisampleQualityLevels Method to check support.

I have GF 8800GT and I can't believe it doesn't support MSAA 2x, altough I have used the method like this:


UINT a;
_result = m_device->CheckMultisampleQualityLevels( DXGI_FORMAT_R8G8B8A8_UNORM, 2, &a );
and the result is S_OK.
jajcek
jajcek
the "a" variable has value 1.

Sorry for the second post, but editing a post with some codes is kinda broken.

// EDIT

Ok I finally made this working.

the value 1 in "a" means that it handles only "0" quality level (from what I have read over the Internet), I tried giving there 4 and it returned me 17 (so 0 to 16 quality?) in the variable a. So I set the sample count to 4 and quality to 1.

furthermore I had to change in depth stencil view the value D3D11_DSV_DIMENSION_TEXTURE2D to D3D11_DSV_DIMENSION_TEXTURE2DMS.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.