Z-fighting & the depthtest

Started by
1 comment, last by TheQaa 11 years, 5 months ago
Hello,
i'm rendering volumetric clouds, which works pretty well. For the next step, i wanted to render some terrain. Previously the depth buffer was disabled, because i sorted all vertices, so there was no need. But for the terrain i need an active depth buffer while rendering the clouds and then i get massive graphic problems. It looks like z-fighting, but i got no idea how to deal with it. Here are some pictures to show my problem.

Enabled depthtest:
http://imageshack.us...7/zfighting.png

Disabled depthtest:
http://imageshack.us...nozfighting.png

Anybody has an idea?
Another question:
Is it possible to write to the depth buffer without depthtesting?

Thanks smile.png
Advertisement
Normally for this sort of thing you would enable depth writes and depth tests for your opaque geometry, and then for your transparent geometry you render with depth tests enabled but depth writes disabled. To do that you will need to separate depth-stencil states. For the opaques, you'll want to set DepthEnable to TRUE and DepthWriteMask to D3D11_DEPTH_WRITE_MASK_ALL. Then for the transparents, you'll want to set DepthEnable to TRUE and DepthWriteMask to D3D11_DEPTH_WRITE_MASK_ZERO. This should solve your problems, as long as you draw the terrain first and the clouds second.

To answer your second question, you can enable depth writes without depth tests. Just Set DepthEnable to FALSE, and DepthWriteMask to D3D11_DEPTH_WRITE_MASK_ALL. You can also leave DepthEnable set to TRUE, and set DepthFunc to D3D11_COMPARISON_ALWAYS.
Thanks for your reply,
with your settings, the z-fighting in the clouds is gone, but when terrain and clouds are intersecting there are still some problems.

http://img28.imageshack.us/img28/6195/cloudsfighting1.png

The depthbuffer description is following:


dsDesc.DepthEnable = true;
dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; // or D3D11_DEPTH_WRITE_MASK_ZERO
dsDesc.DepthFunc = D3D11_COMPARISON_LESS;
dsDesc.StencilEnable = true;
dsDesc.StencilReadMask = 0xFF;
dsDesc.StencilWriteMask = 0xFF;
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;
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;


Maybe i missed something?

This topic is closed to new replies.

Advertisement