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

DirectX 11混合透明对象,结果不理想,directx,direct3d,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].Des

我试图在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);

在非透明对象上渲染透明对象看起来很好。问题是,当我画一个透明的对象,在它上面画另一个透明的对象时,它们的颜色加起来就不那么透明了。如何预防?非常感谢

您的alphablending遵循公式
ResultingColor=alpha*BackbufferColor+(1-alpha)*RenderedColor
。在透明对象的重叠部分,此公式将应用两次。例如,如果alpha为0.5,则第一个对象将替换backbuffercolor 50%。第二个对象从上一个颜色(即50%的背景和50%的第一个对象)中插值50%的颜色,导致总共25%的背景。这就是为什么重叠的透明对象看起来更容易理解的原因


如果希望整个屏幕上的透明度相等,可以将透明对象渲染到屏幕外纹理上。之后,使用固定透明度在backbuffer上渲染此纹理,或者如果需要不同的值,则在纹理中对透明度进行编码。

请发布屏幕截图。当然,两个透明对象加在一起的透明度比单个对象低。