我正在尝试在DirectX 11(DepthBias
)中使用光栅化器状态的D3D11_RASTERIZER_DESC
属性来帮助我在实线多边形(线框)上以线框模式渲染时发生的z-fighting覆盖),似乎将其设置为任何值都不会改变结果。但是我发现了一些奇怪的东西......这个值被定义为INT
而不是FLOAT
。这对我来说没有意义,但它仍然没有按预期工作。如果需要在着色器管道中将INT
解释为UNORM
,我们如何正确设置该值?
这就是我的所作所为:
我可以清楚地看到线框覆盖,但是z战斗是可怕的。我尝试将DepthBias
设置为许多不同的值,例如0.000001
,0.1
,1
,10
,1000
以及所有值减去等价,仍然没有结果......很明显,我知道当把浮动数转换成整数时,所有的小数都会被删除... 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
可能有更好的方法来实现这个目标吗?
谢谢!
答案 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);