2012-10-06 81 views
1

我跟隨了一些關於Sprite渲染和DirectX 11的教程,並瞭解它們,但所有的教程和示例似乎都以繪製1 sprite爲中心。我試圖擴大這一點,並批量友好。DirectX 11 Sprite Alpha混合在另一個Sprite之上

到目前爲止的結果是,如果我在另一個頂部繪製一個精靈,Alpha透明渲染將渲染背景顏色而不是下面的精靈。有誰知道如何正確設置它?

基本上,這是我的渲染循環:

void SpriteManager::render(){ 
    ID3D11DeviceContext* deviceContext; 
    m_d3dDevice->GetImmediateContext(&deviceContext); 
    unsigned int stride = sizeof(Vertex); 
    unsigned int offset = 0; 
    float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; 
    deviceContext->OMSetBlendState(m_alphaBlendState, blendFactor, 0xFFFFFFFF); 
    deviceContext->IASetInputLayout(m_inputLayout); 
    deviceContext->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset); 
    deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 
    deviceContext->VSSetShader(m_vShader, 0, 0); 
    deviceContext->PSSetShader(m_pShader, 0, 0); 
    deviceContext->PSSetSamplers(1, 1, &m_sampler); //Using S1 Register 
    for(unsigned int i = 0; i != m_sprites.size(); ++i) 
    { 
     deviceContext->PSSetShaderResources(1, 1, &(m_sprites[i]->m_textureRV)); 
     XMMATRIX& world = m_sprites[i]->getWorldMatrix(); 
     XMMATRIX& mvp = XMMatrixMultiply(world, vpMatrix_); 
     mvp = XMMatrixTranspose(mvp); 
     deviceContext->UpdateSubresource(mvpCB_, 0, 0, &mvp, 0, 0); //Update ViewProjection Matrix in Shader 
     deviceContext->Draw(6, 0); 
    } 
} 

回答

2

我解決了這個,原來我錯過了1件,這是設置深度模具國家在我的渲染循環並將其添加到SpriteManager類。我在「Beginning DirectX 11遊戲編程」一書中討論了一個例子,它並沒有在Sprite示例中設置Depth Stencil State。希望這對其他人也是有用的信息。

D3D11_DEPTH_STENCIL_DESC dsDesc; 

dsDesc.DepthEnable = FALSE; 
dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; 
dsDesc.DepthFunc = D3D11_COMPARISON_LESS; 
dsDesc.StencilEnable = false; 
dsDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; 
dsDesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; 
dsDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; 
dsDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; 
dsDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_REPLACE; 
dsDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; 
dsDesc.BackFace = dsDesc.FrontFace; 

device->CreateDepthStencilState(&dsDesc, &m_depthStencilState); 

在渲染循環,我現在把這個權限設置混合狀態後:

deviceContext->OMSetDepthStencilState(m_depthStencilState, 0); 
+0

或者當你調用OMSetRenderTargets,設置depthstencilview爲NULL HTTP也可以不綁定深度緩存:// msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx – catflier