我正在尝试使用DepthBias属性在DirectX 11 (D3D11_RASTERIZER_DESC)中的光栅化状态,以帮助在实体多边形(线框覆盖)上呈现线框模式时发生的z战斗,并且似乎将其设置为任何值都不会改变结果。但我注意到一些奇怪的事情..。该值被定义为INT而不是FLOAT。这对我来说没有意义,但它仍然没有像预期的那样起作用。如果它是一个需要解释为着色管道中的INT的UNORM,我们如何正确地设置这个值?
我要做的是:
我可以清楚地看到线框覆盖,但z战斗是可怕的。我尝试将DepthBias设置为许多不同的值,例如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更好的方法来实现这一点
谢谢!
发布于 2013-06-19 22:17:35
http://msdn.microsoft.com/en-us/library/windows/desktop/cc308048(v=vs.85).aspx
取决于您的深度缓冲区是联安办事处还是浮点,数字的含义不同。在大多数情况下,您只是在寻找最小的可能值,以摆脱您的z格斗,而不是任何特定的价值。小值是小偏差,大值是大偏差,但是这在数字上等同于移位取决于深度缓冲区的格式。
至于您尝试过的值,任何小于1的值都会舍入为零,没有效果。1,10,1000可能根本不足以解决这个问题。对于D24 of深度缓冲器,该公式表明1000的深度偏差将抵消深度:1,000* (1 / 2^24),等于0.0000596,在z缓冲项中不是很大的变化。
很大的价值是100,000还是1,000,000是用来解决z战的?
发布于 2013-06-20 17:25:06
如果有人在乎的话,我会给自己做一个宏,让它变得更容易。请注意,只有在使用32位浮点深度缓冲区格式时,此宏才能工作。如果使用不同的深度缓冲区格式,则可能需要不同的宏。
#define DEPTH_BIAS_D32_FLOAT(d) (d/(1/pow(2,23)))这样,您可以简单地使用标准值来设置深度偏差,例如:
RasterizerDesc.DepthBias = DEPTH_BIAS_D32_FLOAT(-0.00001);https://stackoverflow.com/questions/17199817
复制相似问题