我让深度缓冲工作的运气为零。一切都呈现,但仅按照我对它们进行分层的顺序。当我查看 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 框架,我并没有自己做很多创建管道,而且它以前总是有效的!在调试器中,一切看起来都很棒。
我唯一无法检查的是顶点着色器的输出,因为图形调试器会爆炸并崩溃。