Jump to content
  • Advertisement
Sign in to follow this  
nbertoa

[D3D12] Depth Buffer problem (maybe)

This topic is 586 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, community.

 

I have a bug with Screen Space Ambient Occlusion and I suspect is the depth buffer information I use.

 

Depth Stencil View Format is DXGI_FORMAT_D24_UNORM_S8_UINT

Depth Stencil Shader Resource View Format is DXGI_FORMAT_R24_UNORM_X8_TYPELESS

Then its values should be between [0, 1]

 

I made a test to check if depth buffer is sampled correctly. This is the pixel shader (geometry is a full-screen quad). I disabled depth test.

struct Input {
	float4 mPosH : SV_POSITION;
};

Texture2D<float> DepthTexture : register(t0);

struct Output {
	float4 mColor : SV_Target0;
};

Output main(const in Input input){
	Output output = (Output)0;

	const int3 screenCoord = int3(input.mPosH.xy, 0);
	const float depthNDC = DepthTexture.Load(screenCoord);
	output.mColor = float4(depthNDC, depthNDC, depthNDC, 1.0f);
	
	return output;
}

Near Z is 1.0f

Far Z is 2000.0f

so I expect to get total white (1.0f, 1.0f, 1.0f) when the object is at 2000.0f Z and total black (0.0f, 0.0f, 0.0f) when object is at 1.0f Z

 

I recorded the following video, and if I modify Far Z to something like 500.0f or 5000.0f, I get the same black-white gradient results than the video.

That is why I think something is wrong.

 

 

Thoughts? Am I missing something?

Share this post


Link to post
Share on other sites
Advertisement
Depth contains 1/Z? In the case of a far plane Z of 5000, you will have a value near 0 (black color) and in the case of near plane Z of 1, you will have a value of 1 (white color). I think that is not correct, because when you clear depth buffer, you should use 1.0f.

Share this post


Link to post
Share on other sites
Yeah my statement was a little fast, i was just saying we do not store linear depth in a dept buffer. We store z/w to be precise, if you look at the projection matrix, you will find that w ends to be a z, while z is a mixture of scale and bias of z against near and far.

For the we clear at 1.f, it is because of the projection and a dept test set as less or equal.

It is possible to clear at 0.f, using a test set as greater while using afloating point depth buffer.

Share this post


Link to post
Share on other sites

Thanks for your suggestions, both links were useful. Finally, I understood why I see that color (due depth curve shape). Then the bug is not in the depth information. I will continue debugging.

 

Thanks !

Share this post


Link to post
Share on other sites

FYI a common trick used to visualize depth buffers is to just look at the last 10% of the depth range. Like this: 

 

float visualizedDepth = saturate((depthBufferVal - 0.9f) * 10.0f);
Edited by MJP

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!