directx-9 - 使 OpenGL PolygonOffset 和 DirectX9 DepthBias 表现相同

标签 directx-9 depth-buffer

对于我们支持 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/

相关文章:

c++ - 使用深度缓冲区对 2D Sprite 进行分层

java - Libgdx:从多个纹理图集中渲染排序的 Sprite

c++ - DirectX9 中的 Alpha 混合问题

opengl - 使用 FBO 渲染多个深度信息

ios - OpenGL ES 2.0 缓冲区设置

c++ - Directx 和 HLSL - 正常重新计算

opengl - 非单调深度缓冲区; OpenGL 中的循环重叠

c++ - 使用 IDirect3DTexture9::LockRect 时出现 ACCESS_VIOLATION 异常 (0xC0000005)

c++ - ID3DXBaseMesh::CloneMeshFVF 返回 D3DERR_INVALIDCALL

c++ - Sprite 与瓦片 map 的碰撞