DirectX 11.1禁用深度缓冲区

时间:2013-02-13 19:14:33

标签: windows-8 directx-11 c++-cx

这个问题与我提出的previous question有关。

我在平面正方形网格上有一系列48个纹理,我正在渲染它们,它们都组合成一个“场景”。它们每个都有很大比例的透明度,有一个或两个较小的图像,当它们排成一行时,我应该能够看到整个场景。我预计这会有很多问题,但是当我去测试它时,我会看到最顶层的纹理,然后它会有透明度,它只是清晰的颜色。

起初,我认为这是一个问题,我是如何加载图像,并以某种方式禁用alpha,但在玩了清晰的颜色,我意识到有一些透明度。

其次,我尝试过启用混合 - 如果所有纹理都组合在一个z平面上,这就有效。

我在上面链接的问题上发布了我的图片加载和混合代码。

现在我开始认为它可能是深度缓冲区的问题,所以我将以下代码添加到与窗口相关的资源中:

Microsoft::WRL::ComPtr<ID3D11DepthStencilState> DepthDefault;

D3D11_DEPTH_STENCIL_DESC depthstencilDesc;
ZeroMemory(&depthstencilDesc, sizeof(depthstencilDesc));
depthstencilDesc.DepthEnable = FALSE;
depthstencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthstencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.StencilEnable = FALSE;

depthstencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;

depthstencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;

DX::ThrowIfFailed( direct3d.device->CreateDepthStencilState(&depthstencilDesc, DepthDefault.GetAddressOf() ) );

direct3d.context->OMSetDepthStencilState(DepthDefault.Get(), 0);

即使使用此代码,我也只看到最顶层。我错过了什么,或者我设置错误了吗?

编辑:为了使问题可视化,就好像我有48个玻璃窗格,它们都是相同的尺寸,而且它们都在一排。每块玻璃上都有一幅图像。当您浏览所有玻璃窗格时,您将获得所有较小图像组合的一个额外的真实图像。对我来说,directx或像素着色器只绘制第一个玻璃窗格并用透明/背景颜色填充第一个窗格的所有透明度。

修改:我用来创建深度定位视图的代码:

CD3D11_TEXTURE2D_DESC depthStencilDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, backBufferDesc.Width, backBufferDesc.Height, 1, 1, D3D11_BIND_DEPTH_STENCIL );

ComPtr<ID3D11Texture2D> depthStencil;
DX::ThrowIfFailed( direct3d.device->CreateTexture2D( &depthStencilDesc, nullptr, &depthStencil ) );

auto viewDesc = CD3D11_DEPTH_STENCIL_VIEW_DESC(D3D11_DSV_DIMENSION_TEXTURE2D);

DX::ThrowIfFailed( direct3d.device->CreateDepthStencilView( depthStencil.Get(), &viewDesc, &direct3d.depthStencil ) );

该代码完全在我的深度测试/ D3D11_DEPTH_STENCIL_DESC代码之上。我假设这会创建深度代码。

1 个答案:

答案 0 :(得分:1)

如果您想使用深度缓冲区渲染半透明度,我认为您可能需要对渲染顶点的顺序进行排序。如果你不想使用深度缓冲区 - 也许只是不定义/创建/设置它?