0

我让深度缓冲工作的运气为零。一切都呈现,但仅按照我对它们进行分层的顺序。当我查看 VS 图形调试器中的深度模板时,它从未被写入。从我能想到的一切来看,它应该是,但它在调试器中仍然是红色的(这只是意味着它仍然很清晰)。

rendertarget 和 depthstencil 都是由 DXUT 为我创建的,我已经仔细检查了它们,以确保它们看起来都不错。我已经浏览了它的创建代码并打开了 MSDN 并检查了每个标志 - 但是之前有数千人使用过该代码,我怀疑 DXUT 端没问题。

我的渲染目标是 Texture2D,R8G8B8A8_UNORM_SRGB,1280x1024,样本数 1,质量 0,Mip 级别 1,设置为绑定到渲染目标,没有标志。

我的深度模板是 Texture2D,D24_UNORM_S8_UINT,1280x1024,样本数 1,质量 0,Mip 级别 1,设置为绑定为深度模板,没有其他标志。

在渲染开始时,我清除了渲染目标视图。很难搞砸。接下来我清除 DepthStencil:

pd3dImmediateContext->ClearRenderTargetView(DXUTGetD3D11RenderTargetView(), Colors::Black);
pd3dImmediateContext->ClearDepthStencilView(DXUTGetD3D11DepthStencilView(), D3D11_CLEAR_DEPTH, 1.0f, 0);

我所有绘图的深度模板状态是:

DepthEnable      TRUE
DepthFunc        LESS_EQUAL
DepthWriteMask   ALL
StencilEnable    FALSE

DepthStencilView 显示为

Texture2D, D24_UNORM_S8_UINT, no flags, MipSlice 0 

在 VS 图形调试器中。我已将混合设置为固体。

正如我已经确认的那样,它看起来不像 rendertarget 纹理与 depthstencil 纹理的不匹配(例如,多重采样)(除非这两种 DXGI 格式由于某种原因不兼容)。

除了深度之外,一切看起来都不错,所以我假设我的转换矩阵都很好。

在这一点上我唯一的另一个提示是,如果我用 0.999999 清除深度缓冲区,一切都会消失。使用 1.0,一切都可以绘制(尽管深度不正确/缺失)。

视口设置为窗口大小,然后将 0.0 作为最小深度,将 1.0 作为最大深度。这是我检查的第一件事。

我的光栅化状态是:

FillMode SOLID 
CullMode BACK 
FrontCounterClockwise FALSE 
DepthBias 0 
DepthBiasClamp 0.000f 
SlopeScaleDepthBias 0.000f 
DepthClipEnable TRUE 
ScissorEnable FALSE 
MultisampleEnable TRUE 
AntialiasedLineEnable FALSE 

强制采样计数 0

如果上面没有明显的错误,那么接下来要检查的合乎逻辑的事情是什么?鉴于我使用的是 DXUT 框架,我并没有自己做很多创建管道,而且它以前总是有效的!在调试器中,一切看起来都很棒。

我唯一无法检查的是顶点着色器的输出,因为图形调试器会爆炸并崩溃。

4

0 回答 0