1

这个问题与我之前提出的问题有关。

我正在渲染的平面方形网格上有一系列 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 代码之上。我假设这会创建深度代码。

4

1 回答 1

1

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

于 2013-02-13T23:39:12.950 回答