4

我正在尝试使用DirectX DepthBias11 ( D3D11_RASTERIZER_DESCt 改变任何结果。但我注意到一些奇怪的事情......该值被定义为 aINT而不是 a FLOAT。这对我来说没有意义,但它仍然没有按预期工作。INT如果它是一个需要UNORM在着色器管道中解释为 a 的值,我们如何正确设置该值?

这就是我所做的:

  1. 渲染所有几何体
  2. 设置光栅化器以线框呈现
  3. 再次渲染所有几何体

我可以清楚地看到线框覆盖,但是 z-fighting 是可怕的。我尝试将 设置DepthBias为许多不同的值,例如0.000001, 0.1, 1,101000所有减号等价物,仍然没有结果......显然,我知道当将浮点数转换为整数时,所有小数都会被删除.. . 嗯?

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

谢谢!

4

2 回答 2

9

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?

于 2013-06-19T22:17:35.023 回答
1

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

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

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

RasterizerDesc.DepthBias = DEPTH_BIAS_D32_FLOAT(-0.00001);
于 2013-06-20T17:25:06.883 回答