对于我们支持 OpenGL 和 DirectX9 的多平台引擎,我添加了对贴花的支持。在 OpenGL 中,我可以设置 glPolygonOffset(-1.0f, -1.0f)
来修复墙壁和贴花之间的 z-fighting。我希望 DirectX 版本的行为完全相同,所以我称之为:
float offsetFloat = -1.0f;
DWORD offsetDWord = *((DWORD*)&offsetFloat);
device->SetRenderState(D3DRS_DEPTHBIAS, offsetDWord);
device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, offsetDWord);
但是,这给我带来了极大的深度偏差。看来我需要在 DirectX9 中使用极小的值。然而,我似乎找不到有多小。
我注意到在 OGRE 引擎的源代码中,它们除以 250000
,但尽管有评论,我不太明白这个数字来自哪里。另外,出于某种原因,他们只是将常数除以常数?
// D3D also expresses the constant bias as an absolute value, rather than
// relative to minimum depth unit, so scale to fit
constantBias = -constantBias / 250000.0f;
__SetRenderState(D3DRS_DEPTHBIAS, FLOAT2DWORD(constantBias));
slopeScaleBias = -slopeScaleBias;
__SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, FLOAT2DWORD(slopeScaleBias));
所以我的问题是:我需要将什么传递给 DirectX9 才能获得与 glPolygonOffset
完全相同的结果?
最佳答案
我还没有在任何地方找到确切的数字,但通过实验我发现为了在 OpenGL 和 DirectX 中获得大致相同的效果,我需要除以 3500000
,而不是 250000
上面提到过。
如果有人知道确切的数字或为什么会这样,我很想听听,但出于实际目的,我认为这个结论对我有用。
关于directx-9 - 使 OpenGL PolygonOffset 和 DirectX9 DepthBias 表现相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49574413/