我已经学习了一些关于使用 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 );
}
}