【问题标题】:DirectX 11 Sprite Alpha Blending On Top of Another SpriteDirectX 11 Sprite Alpha 混合在另一个 Sprite 之上
【发布时间】:2013-02-03 14:57:04
【问题描述】:

我已经学习了一些关于使用 DirectX 11 进行 Sprite Rendering 的教程,并且理解了它们,但所有教程和示例似乎都以绘制 1 个精灵为中心。我正在尝试扩展它,并且对批处理友好。

目前的结果是,如果我在另一个上面绘制一个精灵,Alpha Transparency 会渲染背景颜色而不是下面的精灵。有谁知道如何正确设置?

基本上,这是我的渲染循环:

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

【问题讨论】:

    标签: directx-11


    【解决方案1】:

    我解决了这个问题,结果发现我遗漏了 1 件,即在我的渲染循环中设置深度模板状态并将其添加到 SpriteManager 类。我正在研究《Beginning DirectX 11 Game Programming》一书中的一个示例,它根本没有在 Sprite 示例中设置深度模板状态。希望这对其他人也有用。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2012-08-02
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多