首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使OpenGL polygonOffset和DirectX9 depthBias的行为相同

使OpenGL polygonOffset和DirectX9 depthBias的行为相同
EN

Stack Overflow用户
提问于 2018-03-30 12:25:19
回答 1查看 540关注 0票数 2

对于我们支持OpenGL和DirectX9的多平台引擎,我增加了对标记的支持。在OpenGL中,我可以将glPolygonOffset(-1.0f, -1.0f)设置为修复墙和贴花之间的z冲突。我希望DirectX版本的行为完全相同,因此我称之为:

代码语言:javascript
复制
float offsetFloat = -1.0f;
DWORD offsetDWord = *((DWORD*)&offsetFloat);
device->SetRenderState(D3DRS_DEPTHBIAS, offsetDWord);
device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, offsetDWord);

然而,这给了我一个非常大的深度偏差。似乎我需要在DirectX9中使用非常小的值。然而,我似乎找不到有多小。

我注意到,在食人魔引擎的源代码中,它们被250000除以,但尽管有评论,我还是不太清楚这个数字是从哪里来的。另外,他们只是出于某种原因除以常量?

代码语言:javascript
复制
// 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完全相同的结果?

EN

回答 1

Stack Overflow用户

发布于 2021-03-06 11:09:27

如果查看OpenGL多边形偏移量的方程和等效的Direct3D 9呈现状态,您会发现它们是相同的,而不是OpenGL有一个与实现相关的常量值的术语。如果我们假设这个值是1,那么方程就会变得相同。

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

不幸的是,OpenGL似乎没有提供一种查询它的方法,所以您唯一能做的就是旋转参数,直到您找到一些有用的东西,然后在出现边缘情况时再旋转一些参数,并且永远不要认为对您有用的东西会对其他人有用。

Direct3D的假设,即值总是1,也不一定总是好的。

底线是,多边形偏移不是一个100%稳健的方法,以解决z-战斗在任何情况下。你有没有尝试过其他的方法,比如把你的贴花贴在正常的表面上?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49574413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档