Jump to content
  • Advertisement
Sign in to follow this  
DarkRonin

DX11 Depth buffer not working

This topic is 766 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 Guys,

I am having trouble with my depth buffer in my project.

I am creating it as follows;

int Engine::DepthStencilCreate()
{
	D3D11_TEXTURE2D_DESC descDepth;
	descDepth.Width = nWidth;
	descDepth.Height = nHeight;
	descDepth.MipLevels = 1;
	descDepth.ArraySize = 1;
	descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
	descDepth.SampleDesc.Count = nFsaa;
	descDepth.SampleDesc.Quality = 0;
	descDepth.Usage = D3D11_USAGE_DEFAULT;
	descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
	descDepth.CPUAccessFlags = 0;
	descDepth.MiscFlags = 0;
	if (d3dDevice->CreateTexture2D(&descDepth, NULL, &pDepthStencil))
	{
		MessageBox(NULL, "Failed to create depth buffer", "Error", NULL);
		return 1;
	}

	D3D11_DEPTH_STENCIL_DESC dsDesc;
	dsDesc.DepthEnable = true;
	dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
	dsDesc.DepthFunc = D3D11_COMPARISON_LESS;

	// Stencil test parameters
	dsDesc.StencilEnable = true;
	dsDesc.StencilReadMask = 0xFF;
	dsDesc.StencilWriteMask = 0xFF;

	// Stencil operations if pixel is front-facing
	dsDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
	dsDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

	// Stencil operations if pixel is back-facing
	dsDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
	dsDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

	// Create depth stencil state
	if(d3dDevice->CreateDepthStencilState(&dsDesc, &pDSState))
	{
		MessageBox(NULL, "Failed to create depth stencil state", "Error", NULL);
		return 1;
	}

	// Bind depth stencil state
	d3dContext->OMSetDepthStencilState(pDSState, 1);

	D3D11_DEPTH_STENCIL_VIEW_DESC descDSV;
	descDSV.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
	descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;	//D3D11_DSV_DIMENSION_TEXTURE2D;
	descDSV.Texture2D.MipSlice = 0;
	descDSV.Flags = 0;

	// Create the depth stencil view
	//ID3D11DepthStencilView* pDSV;
	if (d3dDevice->CreateDepthStencilView(pDepthStencil, &descDSV, &pDSV))
	{
		MessageBox(NULL, "Failed to create depth stencil view", "Error", NULL);
		return 1;
	}

	// Bind the depth stencil view
	d3dContext->OMSetRenderTargets(1,&d3dBackBuffer,pDSV);     // Depth stencil view for the render target

	return 0;
}
The code runs perfectly without error and the DX11 debugger is not reporting any problems. I am also clearing it each frame.

Geometry is drawing over itself out of order as if the depth buffer is not turned on.

I can verify in the Graphical Debugger that the geometry is correct.

Any advice on why depth isn't working correctly would be greatly appreciated.

Thanks in advance :)

Share this post


Link to post
Share on other sites
Advertisement
edit: ignore the following. Sanity has left the building.

logic coding error...see below
 


int Engine::DepthStencilCreate()
{
	D3D11_TEXTURE2D_DESC descDepth;
	descDepth.Width = nWidth;
	descDepth.Height = nHeight;
	descDepth.MipLevels = 1;
	descDepth.ArraySize = 1;
	descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
	descDepth.SampleDesc.Count = nFsaa;  // << look into this (try setting count to 1)
	descDepth.SampleDesc.Quality = 0;
	descDepth.Usage = D3D11_USAGE_DEFAULT;
	descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
	descDepth.CPUAccessFlags = 0;
	descDepth.MiscFlags = 0;

  //
  // you see you're failing creation here when you 'do not' get your message box
  // if (!) then log fail

	if (d3dDevice->CreateTexture2D(&descDepth, NULL, &pDepthStencil))
	{
		MessageBox(NULL, "Failed to create depth buffer", "Error", NULL);
		return 1;
	}

  //
  // the rest looks fine
	D3D11_DEPTH_STENCIL_DESC dsDesc;
	dsDesc.DepthEnable = true;
	dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
	dsDesc.DepthFunc = D3D11_COMPARISON_LESS;

	// Stencil test parameters
	dsDesc.StencilEnable = true;
	dsDesc.StencilReadMask = 0xFF;
	dsDesc.StencilWriteMask = 0xFF;

	// Stencil operations if pixel is front-facing
	dsDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
	dsDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

	// Stencil operations if pixel is back-facing
	dsDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
	dsDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
	dsDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

	// Create depth stencil state
	if(d3dDevice->CreateDepthStencilState(&dsDesc, &pDSState))
	{
		MessageBox(NULL, "Failed to create depth stencil state", "Error", NULL);
		return 1;
	}

	// Bind depth stencil state
	d3dContext->OMSetDepthStencilState(pDSState, 1);

	D3D11_DEPTH_STENCIL_VIEW_DESC descDSV;
	descDSV.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
	descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;	//D3D11_DSV_DIMENSION_TEXTURE2D;
	descDSV.Texture2D.MipSlice = 0;
	descDSV.Flags = 0;

	// Create the depth stencil view
	//ID3D11DepthStencilView* pDSV;
	if (d3dDevice->CreateDepthStencilView(pDepthStencil, &descDSV, &pDSV))
	{
		MessageBox(NULL, "Failed to create depth stencil view", "Error", NULL);
		return 1;
	}

	// Bind the depth stencil view
	d3dContext->OMSetRenderTargets(1,&d3dBackBuffer,pDSV);     // Depth stencil view for the render target

	return 0;
}

Share this post


Link to post
Share on other sites

// you see you're failing creation here when you 'do not' get your message box // if (!) then log fail if (d3dDevice->CreateTexture2D(&descDepth, NULL, &pDepthStencil)) { MessageBox(NULL, "Failed to create depth buffer", "Error", NULL); return 1; }


The functions return zero on success, so the code is actually correct on that front.

I tried playing with the SampleDesc count, but changing that does result in an error as it needs to match the backbuffer SampleDesc count.

So, still no closer I'm afraid.

Share this post


Link to post
Share on other sites
Just worked out what was going on.

I had another call to OMSetRenderTargets() in my render target manager, but the last parameter was set to zero, causing the depth buffer to no longer be associated with the target.

Share this post


Link to post
Share on other sites
hmmm...that's a trip.
you're right. I don't like the way that looks, even though it's correct. Doesn't read well.
 
HRESULT test_okay = S_OK; // == 0L
 
if (test_okay)
   MessageBox(0, L"not okay", L"fail", 0);
else
   MessageBox(0, L"okay", L"good", 0); // <---- this path is traveled 
Clearly I don't understand what I'm talking about.

+1 for getting it working.
Probably still should be using the FAILED or SUCCEEDED macro because we're looking for negative fail values,
and as you said, zero on success.

but if it's not broke... :) Edited by Goliath Forge

Share this post


Link to post
Share on other sites

hmmm...that's a trip.you're right. I don't like the way that looks, even though it's correct. Doesn't read well. 


HRESULT test_okay = S_OK; // == 0L
 
if (test_okay)
   MessageBox(0, L"not okay", L"fail", 0);
else
   MessageBox(0, L"okay", L"good", 0); // <---- this path is traveled 
Clearly I don't understand what I'm talking about.+1 for getting it working.Probably still should be using the FAILED or SUCCEEDED macro because we're looking for negative fail values,and as you said, zero on success.but if it's not broke... :)


Yeah, I see your point. I just looked up the macro and anything negative is a fail, so positive values will possibly give a false fail. Edited by DarkRonin

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.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!