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

这是我所做的:

  • 渲染所有几何体
  • 设置光栅化器在线框渲染
  • 再次渲染所有几何体

  • 我可以清楚地看到线框叠加层,但是 z-fighting 太可怕了。我试图将 DepthBias 设置为许多不同的值,例如 0.0000010.11101000 和所有负等价物,仍然没有结果......显然,我知道将浮点数转换为整数时,所有小数被削减......嗯?
    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 更好的方法来实现这一点?

    谢谢!

    最佳答案

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

    根据您的深度缓冲区是 UNORM 还是浮点数,数字的含义会有所不同。在大多数情况下,您只是在寻找消除 z-fighting 的最小可能值,而不是任何特定值。小值是小偏差,大值是大偏差,但这在数值上如何等同于偏移取决于深度缓冲区的格式。

    至于您尝试过的值,任何小于 1 的值都会舍入为零且无效。 1、10、1000 可能根本不足以解决问题。在 D24 UNORM 深度缓冲区的情况下,公式表明 1000 的深度偏差将使深度偏移:1000 * (1/2^24),等于 0.0000596,在 z 缓冲方面不是很显着的变化。

    100,000 或 1,000,000 的大值是否可以修复 z-fighting?

    关于DirectX11 线框 z-fighting 帮助(或者为什么 D3D11_RASTERIZER_DESC.DepthBias 是一个 INT?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17199817/

    10-11 08:56