DirectX 11混合透明对象,不是理想的结果

时间:2013-12-18 18:04:53

标签: directx direct3d

我试图在D3D11中实现透明对象。我已经设置了这样的混合状态:

D3D11_BLEND_DESC blendDesc;

ZeroMemory(&blendDesc, sizeof (D3D11_BLEND_DESC));


blendDesc.RenderTarget[0].BlendEnable = TRUE;
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; //0x0f;
// set blending
m_d3dDevice->CreateBlendState(&blendDesc, &blendState);

float blendFactor[4] = {1,1,1, 1 };
m_d3dContext->OMSetBlendState(blendState, blendFactor, 0xffffffff);

在非透明对象上渲染透明对象看起来很好。问题是,当我绘制透明对象和其上的另一个透明对象时,它们的颜色相加并且透明度较低。怎么预防这个?非常感谢你

1 个答案:

答案 0 :(得分:1)

您的alphablending遵循公式ResultingColor = alpha * BackbufferColor + (1-alpha) * RenderedColor。在透明对象的重叠部分,此公式将应用两次。例如,如果您的alpha为0.5,则第一个对象将替换backbuffercolor为50%。第二个对象将其颜色插入前一种颜色的50%,即50%背景和50%第一个对象,总共占背景的25%。这就是重叠透明对象看起来更加明显的原因。

如果您希望整个屏幕具有相同的透明度,则可以将透明对象渲染到屏幕外纹理上。之后,使用修复透明度在后备缓冲区上渲染此纹理,或者如果需要不同的值,则在纹理中对透明度进行编码。