对于我们支持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中使用非常小的值。然而,我似乎找不到有多小。
我注意到,在食人魔引擎的源代码中,它们被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完全相同的结果?
发布于 2021-03-06 11:09:27
如果查看OpenGL多边形偏移量的方程和等效的Direct3D 9呈现状态,您会发现它们是相同的,而不是OpenGL有一个与实现相关的常量值的术语。如果我们假设这个值是1,那么方程就会变得相同。
这里明显的问题是:当值不是1时会发生什么?
不幸的是,OpenGL似乎没有提供一种查询它的方法,所以您唯一能做的就是旋转参数,直到您找到一些有用的东西,然后在出现边缘情况时再旋转一些参数,并且永远不要认为对您有用的东西会对其他人有用。
Direct3D的假设,即值总是1,也不一定总是好的。
底线是,多边形偏移不是一个100%稳健的方法,以解决z-战斗在任何情况下。你有没有尝试过其他的方法,比如把你的贴花贴在正常的表面上?
https://stackoverflow.com/questions/49574413
复制相似问题