与Direct3D SpriteBatch混合使用

时间:2013-02-15 08:19:32

标签: c++ directx graphic blending

我正在努力实现一个简单的效果:在屏幕上用透明背景绘制图像。我正在使用SpriteBatches来做到这一点。

以下是我创建混合状态的代码:

D3D11_BLEND_DESC descBlend;
ZeroMemory(&descBlend, sizeof(descBlend));
descBlend.RenderTarget[0].BlendEnable = true;
descBlend.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
descBlend.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
descBlend.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
descBlend.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
descBlend.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
descBlend.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;

m_d3dDevice->CreateBlendState(&descBlend, &m_Blend);

我开始用我的精灵画画:

m_SpriteBatch->Begin(SpriteSortMode_BackToFront, m_Blend);

屏幕上没有显示任何内容!我错过了什么吗?

我确定我的图像是正确的,因为当我在没有启用混合的情况下进行绘制时,除透明部分变为纯白色外,所有内容都会显示。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

在混合过程中,您必须确定渲染目标的每个像素的哪些成分是可写的。

descBlend.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

答案 1 :(得分:1)

使用ZeroMemory(&descBlend, sizeof(descBlend));清除D3D11_BLEND_DESC的所有字段,包括RenderTargetWriteMask。此掩码确定是否写入通道,如果没有写入任何内容。尝试将其设置为D3D11_COLOR_WRITE_ENABLE_ALL

答案 2 :(得分:1)

我曾经尝试过类似的事情并写下了我在gamedev

所做的事情
相关问题