Jump to content

  • Log In with Google      Sign In   
  • Create Account

How to enable MSAA in DirectX 11


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 jajcek   Members   -  Reputation: 274

Like
0Likes
Like

Posted 21 January 2013 - 06:16 AM

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.



Sponsor:

#2 TiagoCosta   Crossbones+   -  Reputation: 2189

Like
0Likes
Like

Posted 21 January 2013 - 06:31 AM

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, 21 January 2013 - 06:35 AM.


#3 jajcek   Members   -  Reputation: 274

Like
0Likes
Like

Posted 21 January 2013 - 07:15 AM

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.
 


#4 jajcek   Members   -  Reputation: 274

Like
0Likes
Like

Posted 21 January 2013 - 07:33 AM

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, 21 January 2013 - 07:38 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS