2012-10-06 4 views
1

J'ai suivi quelques tutoriels sur Sprite Rendering avec DirectX 11, et je les comprends, mais tous les tutoriels et les échantillons semblent centrés sur le dessin 1 sprite. J'essaie de prolonger cela, et être favorable au lot. Le résultat jusqu'à présent, est que si je dessine un sprite sur l'autre, la transparence Alpha rend la couleur d'arrière-plan au lieu de l'image-objet ci-dessous. Est-ce que quelqu'un sait comment mettre en place correctement?DirectX 11 Sprite Alpha se fondant sur un autre sprite

Fondamentalement, ceci est ma boucle de rendu:

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); 
    } 
} 

Répondre

2

Je résolu ce problème, il se trouve que je manquais 1 pièce, qui a été réglage de la profondeur Stencil Etat dans mon rendu en boucle et en ajoutant à la Classe SpriteManager. Je travaillais sur un exemple dans le livre Beginning DirectX 11 Game Programming, qui ne définit pas du tout l'état du stencil de profondeur dans l'exemple Sprite. Espérons que ce soit une information utile pour les autres aussi.

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); 

Dans Render boucle, je l'appelle maintenant ce droit après la mise en état de mélange:

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

Sinon, vous pouvez aussi ne pas lier le tampon de profondeur lorsque vous appelez OMSetRenderTargets, définissez le depthstencilview NULL http: // msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx – catflier