2013-02-13 63 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