Jump to content
  • Advertisement
Sign in to follow this  
jajcek

DX11 How to enable MSAA in DirectX 11

This topic is 2148 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

Share this post


Link to post
Share on other sites
Advertisement
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. Edited by TiagoCosta

Share this post


Link to post
Share on other sites

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.
 

Share this post


Link to post
Share on other sites
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. Edited by jajcek

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!