【问题标题】:DirectX 11.1 Disable the depth bufferDirectX 11.1 禁用深度缓冲区
【发布时间】:2013-02-14 21:30:00
【问题描述】:

这个问题与我问过的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 或像素着色器仅绘制第一个玻璃窗格并用透明/背景颜色填充第一个窗格的所有透明度。

编辑:我用来创建 depthstencilview 的代码:

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 代码的正上方。我假设这会创建深度代码。

【问题讨论】:

  • 您的深度缓冲区代码看起来不错,请参阅我在您的其他问题中的回答

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


【解决方案1】:

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

【讨论】:

  • 我添加了我的代码来创建一个深度模板视图,我假设它会创建一个深度缓冲区作为模板缓冲区的一部分。此外,我尝试从前到后和从前到后渲染我的窗格 - 经过一些测试,我可以让它渲染到最远的后窗格,但没有一个在前面。我划分了我的窗格以将它们组合在 3 个单独的 z 索引上,并且 z=0.0 上的所有索引都正确组合,其他窗格未呈现。我尝试过使用 depthstencilDesc.FrontFace 和 .BackFace 函数以及通过/失败操作,但没有任何成功。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2012-04-12
  • 2018-05-27
相关资源
最近更新 更多