DirectX11线框z-fighting帮助(或者为什么D3D11_RASTERIZER_DESC.DepthBias是INT?)

时间:2013-06-19 19:35:10

标签: directx directx-11 wireframe

我正在尝试在DirectX 11(DepthBias)中使用光栅化器状态的D3D11_RASTERIZER_DESC属性来帮助我在实线多边形(线框)上以线框模式渲染时发生的z-fighting覆盖),似乎将其设置为任何值都不会改变结果。但是我发现了一些奇怪的东西......这个值被定义为INT而不是FLOAT。这对我来说没有意义,但它仍然没有按预期工作。如果需要在着色器管道中将INT解释为UNORM,我们如何正确设置该值?

这就是我的所作所为:

  1. 渲染所有几何体
  2. 将光栅化器设置为在线框中渲染
  3. 再次渲染所有几何体
  4. 我可以清楚地看到线框覆盖,但是z战斗是可怕的。我尝试将DepthBias设置为许多不同的值,例如0.0000010.11101000以及所有值减去等价,仍然没有结果......很明显,我知道当把浮动数转换成整数时,所有的小数都会被删除... meh?

    D3D11_RASTERIZER_DESC RasterizerDesc;
    ZeroMemory(&RasterizerDesc, sizeof(RasterizerDesc));
    RasterizerDesc.FillMode = D3D11_FILL_WIREFRAME;
    RasterizerDesc.CullMode = D3D11_CULL_BACK;
    RasterizerDesc.FrontCounterClockwise = FALSE;
    RasterizerDesc.DepthBias = ???
    RasterizerDesc.SlopeScaledDepthBias = 0.0f;
    RasterizerDesc.DepthBiasClamp = 0.0f;
    RasterizerDesc.DepthClipEnable = TRUE;
    RasterizerDesc.ScissorEnable = FALSE;
    RasterizerDesc.MultisampleEnable = FALSE;
    RasterizerDesc.AntialiasedLineEnable = FALSE;
    

    有谁知道如何正确设置DepthBias?或者它可能是DirectX中的一个错误(我怀疑)或者再次使用DepthBias可能有更好的方法来实现这个目标吗?

    谢谢!

2 个答案:

答案 0 :(得分:9)

http://msdn.microsoft.com/en-us/library/windows/desktop/cc308048(v=vs.85).aspx

取决于您的深度缓冲区是UNORM还是浮点数量的含义。在大多数情况下,您只是寻找摆脱z战斗而不是任何特定值的最小可能值。小值是一个很小的偏差,大值是一个很大的偏差,但这在数字上等同于一个偏移取决于深度缓冲的格式。

至于你尝试过的值,任何小于1的值都会舍入为零并且没有效果。 1,10,1000可能根本不足以解决问题。在D24 UNORM深度缓冲区的情况下,公式将建议深度偏差为1000将使深度偏移:1000 *(1/2 ^ 24),等于0.0000596,这是z缓冲项的非常显着的变化。 / p>

100,000或1,000,000的大值是否能解决z战斗问题?

答案 1 :(得分:0)

如果有人关心,我自己做了一个宏来让它变得更容易。请注意,只有在使用32位浮点深度缓冲区格式时,此宏才有效。如果使用不同的深度缓冲区格式,则可能需要使用不同的宏。

#define DEPTH_BIAS_D32_FLOAT(d) (d/(1/pow(2,23)))

这样您就可以使用标准值设置深度偏差,例如:

RasterizerDesc.DepthBias = DEPTH_BIAS_D32_FLOAT(-0.00001);