使OpenGL polygonoffset和DirectX9 DepthBias的行为相同



对于支持OpenGL和DirectX9的乘法引擎,我正在添加对贴花的支持。在OpenGL中,我可以将glPolygonOffset(-1.0f, -1.0f)设置为固定墙壁和贴花之间的Z战斗。我希望DirectX版本的行为完全相同,所以我称之为:

float offsetFloat = -1.0f;
DWORD offsetDWord = *((DWORD*)&offsetFloat);
device->SetRenderState(D3DRS_DEPTHBIAS, offsetDWord);
device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, offsetDWord);

但是,这给了我极大的深度偏见。似乎我需要在DirectX9中使用极小的值。但是,我似乎找不到如何小。

我注意到,在Ogre Engine的来源中,它们除以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

如果有人知道确切的数字或为什么是这样,我很想听到这一点,但是出于实际目的,我认为这个结论对我有才华。

如果您查看了openGL多边形偏移的方程和等效的direct3d 9渲染,您会发现它们相同价值。如果我们假设该值为1,则方程确实变得相同。

这里明显的问题是:当值不是1时会发生什么?

不幸的是,OpenGL似乎没有提供查询它的方法,因此您唯一可以做的就是Twiddle参数,直到找到有效的东西,然后随着Edge Case的出现而扭动它们,并且永远不要假设什么有效因为您将为其他任何人工作。

direct3d的假设,即该值始终为1,也不一定会一直保持良好。

最重要的是,多边形偏移量不是在任何情况下固定Z-Righting的100%强大方法。您是否尝试过其他方法,例如将贴花沿正常表面推出epsilon?

最新更新