DirectX11线框z-战斗帮助(或者为什么D3D11_光栅化器_DESC.DepthBias是INT?)

DirectX11线框z-战斗帮助(或者为什么D3D11_光栅化器_DESC.DepthBias是INT?),directx,directx-11,wireframe,Directx,Directx 11,Wireframe,我试图在DirectX 11(D3D11_光栅化器_DESC)中的光栅化器状态上使用DepthBias属性来帮助处理在实心多边形(线框覆盖)上以线框模式渲染时发生的z向冲突,并且似乎将其设置为任何值都不会改变结果。但是我注意到一些奇怪的事情。。。该值被定义为INT,而不是FLOAT。这对我来说没有意义,但它仍然没有像预期的那样正常工作。如果该值是着色器管道中需要解释为UNORM的INT,我们如何正确设置该值 我是这样做的: 渲染所有几何体 将光栅化器设置为线框渲染 再次渲染所有几何体 我可以清楚

我试图在DirectX 11(
D3D11_光栅化器_DESC
)中的光栅化器状态上使用
DepthBias
属性来帮助处理在实心多边形(线框覆盖)上以线框模式渲染时发生的z向冲突,并且似乎将其设置为任何值都不会改变结果。但是我注意到一些奇怪的事情。。。该值被定义为
INT
,而不是
FLOAT
。这对我来说没有意义,但它仍然没有像预期的那样正常工作。如果该值是着色器管道中需要解释为
UNORM
INT
,我们如何正确设置该值

我是这样做的:

  • 渲染所有几何体
  • 将光栅化器设置为线框渲染
  • 再次渲染所有几何体
  • 我可以清楚地看到线框覆盖,但z-战斗是可怕的。我试图将
    深度偏差设置为许多不同的值,例如
    0.000001
    0.1
    1
    10
    1000
    ,以及所有的负等效值,仍然没有结果。。。显然,我知道当将浮点转换为整数时,所有的小数都会被切掉。。。嗯

    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中的一个bug(我对此表示怀疑),或者也许有比使用
    DepthBias
    更好的方法来实现这一点

    谢谢大家!

    根据深度缓冲区是UNORM还是浮点,数字的含义会有所不同。在大多数情况下,你只是在寻找尽可能小的价值,而不是任何具体的价值,以摆脱你的z-战斗。小值表示小偏差,大值表示大偏差,但其在数值上等同于移位的方式取决于深度缓冲区的格式

    至于您尝试过的值,任何小于1的值都将四舍五入为零,并且没有任何效果。1、10、1000可能根本不足以解决问题。在D24 UNORM深度缓冲区的情况下,公式将建议深度偏移1000,深度偏移量为:1000*(1/2^24),等于0.0000596,z缓冲项的偏移不太显著


    100000或1000000的大值是否可以修复z-fighting?

    如果有人关心,我为自己制作了一个宏以使其更简单。请注意,只有在使用32位浮点深度缓冲区格式时,此宏才能工作。如果使用不同的深度缓冲区格式,则可能需要不同的宏

    #define DEPTH_BIAS_D32_FLOAT(d) (d/(1/pow(2,23)))
    
    这样,您只需使用标准值设置深度偏差,例如:

    RasterizerDesc.DepthBias = DEPTH_BIAS_D32_FLOAT(-0.00001);
    

    是的,这很有效。我正在使用一个D32_浮点深度缓冲区,所以它适合我。有了你的解释,我现在明白多了,谢谢!