我没有运气获得深度缓冲工作。一切都呈现出来,但只是按照我对它们进行分层的顺序。当我查看VS Graphics Debugger中的深度模板时,它永远不会被写入。它应该是,从我能想到的一切,但它在调试器中仍然是红色的(这意味着它仍然清晰)。
rendertarget和deepstencil都是由DXUT为我创建的,我已经仔细检查了它们,以确保它们看起来都很好。我已经走了它的创建代码并打开了MSDN并检查了每个标志 - 但是之前有成千上万的人使用过该代码,我怀疑DXUT结束了。
我的rendertarget是Texture2D,R8G8B8A8_UNORM_SRGB,1280x1024,样本数1,质量0,Mip级别1,设置为绑定到渲染目标,没有标记。
我的深度模板是Texture2D,D24_UNORM_S8_UINT,1280x1024,样本数1,质量0,Mip级别1,设置为绑定为深度模板,没有其他标志。
在渲染开始时,我清除了rendertargetview。很难搞砸了。接下来我清除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 Graphics调试器中的。我将混合设置为实体。
对于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
ForcedSampleCount 0
如果上面没有任何明显的错误,那么接下来要检查的是什么?鉴于我正在使用DXUT框架,我自己并没有做很多创作管道,而且以前总是工作!在调试器中,它看起来都很棒。
我唯一无法检查的是顶点着色器的输出,因为图形调试器会爆炸并崩溃。