1

DirectX 11 を使用したスプライト レンダリングに関するいくつかのチュートリアルに従い、それらを理解しましたが、すべてのチュートリアルとサンプルは 1 つのスプライトの描画を中心にしているようです。私はそれを拡張し、バッチフレンドリーにしようとしています。

これまでのところ、あるスプライトを別のスプライトの上に描画すると、アルファ透明度が下のスプライトではなく背景色をレンダリングします。これを適切に設定する方法を知っている人はいますか?

基本的に、これは私のレンダリングループです:

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

4

1 に答える 1

2

私はこれを解決しました。レンダー ループで深度ステンシル ステートを設定し、それを SpriteManager クラスに追加していた 1 つのピースが欠けていたことがわかりました。私は本 Beginning DirectX 11 Game Programming の例に取り組んでいましたが、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);
于 2012-10-06T18:52:46.943 に答える