此問題與我詢問的previous question有關。DirectX 11.1禁用深度緩衝區
我在一個扁平方形網格上繪製了一系列48個紋理,我將它們組合起來形成一個「場景」。他們每個人都有很大比例的透明度和一個或兩個較小的圖像,當他們排隊時,我應該能夠看到完整的場景。我預計這可以毫無問題地工作,但是當我去測試它時,我會看到最頂級的紋理,然後在任何具有透明度的地方看到,這只是一種清晰的顏色。
起初,我認爲這是一個問題,我是如何加載圖像,並以某種方式禁用阿爾法,但玩弄了清晰的顏色後,我意識到有一些透明度。
其次,我試過的是啓用混合 - 如果所有的紋理都合併到一個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代碼。我假設這會創建深度代碼。
你的深度緩衝的代碼看起來不錯,看在你的另一個問題 – thumbmunkeys 2013-02-13 23:47:43