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

Dea*_*con 4 directx wireframe directx-11

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

这是我做的:

  1. 渲染所有几何体
  2. 将光栅化器设置为在线框中渲染
  3. 再次渲染所有几何体

我可以清楚地看到线框覆盖,但z战斗是可怕的.我试着设置DepthBias了很多不同的值,例如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;
Run Code Online (Sandbox Code Playgroud)

任何人都想出如何DepthBias正确设置?或者它可能是DirectX中的一个错误(我怀疑)或者再一次可能有更好的方法来实现这个而不是使用DepthBias

谢谢!

Ada*_*les 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缓冲项的非常显着的偏移.

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