Draw调用没有写入深度缓冲区

时间:2015-09-22 03:03:42

标签: c++ direct3d direct3d11 dxut

我没有运气获得深度缓冲工作。一切都呈现出来,但只是按照我对它们进行分层的顺序。当我查看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框架,我自己并没有做很多创作管道,而且以前总是工作!在调试器中,它看起来都很棒。

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

0 个答案:

没有答案