2013-02-13 160 views
1

此問題與我詢問的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代碼。我假設這會創建深度代碼。

+0

你的深度緩衝的代碼看起來不錯,看在你的另一個問題 – thumbmunkeys 2013-02-13 23:47:43

回答

1

我想你可能需要對渲染頂點的順序進行排序,如果你想渲染具有深度緩衝區的半透明片。如果你不想使用深度緩衝區 - 也許只是不定義/創建/設置它?

+0

我將自己的代碼來創建一個深度模具視圖,我假設創建一個深度緩存作爲模板緩存的一部分,我的答案。另外,我試着將我的窗格正面背面渲染,然後回到正面 - 經過一些測試後,我可以將它渲染到最遠的背面窗格,但沒有一個在前面。我將我的窗格分割成3個獨立的z索引,並且z = 0.0上的所有索引合併,其他窗格不渲染。我曾嘗試使用depthstencilDesc.FrontFace和.BackFace函數以及通過/失敗操作,但沒有取得任何成功。 – OzBarry 2013-02-14 13:30:34