DirectX11线框z-战斗帮助(或者为什么D3D11_光栅化器_DESC.DepthBias是INT?)
我试图在DirectX 11(DirectX11线框z-战斗帮助(或者为什么D3D11_光栅化器_DESC.DepthBias是INT?),directx,directx-11,wireframe,Directx,Directx 11,Wireframe,我试图在DirectX 11(D3D11_光栅化器_DESC)中的光栅化器状态上使用DepthBias属性来帮助处理在实心多边形(线框覆盖)上以线框模式渲染时发生的z向冲突,并且似乎将其设置为任何值都不会改变结果。但是我注意到一些奇怪的事情。。。该值被定义为INT,而不是FLOAT。这对我来说没有意义,但它仍然没有像预期的那样正常工作。如果该值是着色器管道中需要解释为UNORM的INT,我们如何正确设置该值 我是这样做的: 渲染所有几何体 将光栅化器设置为线框渲染 再次渲染所有几何体 我可以清楚
D3D11_光栅化器_DESC
)中的光栅化器状态上使用DepthBias
属性来帮助处理在实心多边形(线框覆盖)上以线框模式渲染时发生的z向冲突,并且似乎将其设置为任何值都不会改变结果。但是我注意到一些奇怪的事情。。。该值被定义为INT
,而不是FLOAT
。这对我来说没有意义,但它仍然没有像预期的那样正常工作。如果该值是着色器管道中需要解释为UNORM
的INT
,我们如何正确设置该值
我是这样做的:
深度偏差设置为许多不同的值,例如0.000001
,0.1
,1
,10
,1000
,以及所有的负等效值,仍然没有结果。。。显然,我知道当将浮点转换为整数时,所有的小数都会被切掉。。。嗯
D3D11_RASTERIZER_DESC RasterizerDesc;
ZeroMemory(&RasterizerDesc, sizeof(RasterizerDesc));
RasterizerDesc.FillMode = D3D11_FILL_WIREFRAME;
RasterizerDesc.CullMode = D3D11_CULL_BACK;
RasterizerDesc.FrontCounterClockwise = FALSE;
RasterizerDesc.DepthBias = ???
RasterizerDesc.SlopeScaledDepthBias = 0.0f;
RasterizerDesc.DepthBiasClamp = 0.0f;
RasterizerDesc.DepthClipEnable = TRUE;
RasterizerDesc.ScissorEnable = FALSE;
RasterizerDesc.MultisampleEnable = FALSE;
RasterizerDesc.AntialiasedLineEnable = FALSE;
有人知道如何正确设置DepthBias
了吗?或者这可能是DirectX中的一个bug(我对此表示怀疑),或者也许有比使用DepthBias
更好的方法来实现这一点
谢谢大家!
根据深度缓冲区是UNORM还是浮点,数字的含义会有所不同。在大多数情况下,你只是在寻找尽可能小的价值,而不是任何具体的价值,以摆脱你的z-战斗。小值表示小偏差,大值表示大偏差,但其在数值上等同于移位的方式取决于深度缓冲区的格式
至于您尝试过的值,任何小于1的值都将四舍五入为零,并且没有任何效果。1、10、1000可能根本不足以解决问题。在D24 UNORM深度缓冲区的情况下,公式将建议深度偏移1000,深度偏移量为:1000*(1/2^24),等于0.0000596,z缓冲项的偏移不太显著
100000或1000000的大值是否可以修复z-fighting?如果有人关心,我为自己制作了一个宏以使其更简单。请注意,只有在使用32位浮点深度缓冲区格式时,此宏才能工作。如果使用不同的深度缓冲区格式,则可能需要不同的宏
#define DEPTH_BIAS_D32_FLOAT(d) (d/(1/pow(2,23)))
这样,您只需使用标准值设置深度偏差,例如:
RasterizerDesc.DepthBias = DEPTH_BIAS_D32_FLOAT(-0.00001);
是的,这很有效。我正在使用一个D32_浮点深度缓冲区,所以它适合我。有了你的解释,我现在明白多了,谢谢!