DirectX 11 Alpha混合不起作用



好吧,所以我一直在尝试让Alpha Blending在我的3D应用程序中工作,但它就是不想发生。我在渲染循环的最后用正交投影绘制2d图像(深度测试仍处于启用状态),图像纹理有透明部分,但它们渲染为黑色。这是我的混合代码:

D3D11_BLEND_DESC blendStateDesc; 
ZeroMemory(&blendStateDesc, sizeof(D3D11_BLEND_DESC));
blendStateDesc.AlphaToCoverageEnable = FALSE;
blendStateDesc.IndependentBlendEnable = FALSE;        
blendStateDesc.RenderTarget[0].BlendEnable = TRUE;
blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
blendStateDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
blendStateDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
if (FAILED(device->CreateBlendState(&blendStateDesc, &blendState))) {
printf("Failed To Create Blend Staten");
}
deviceContext->OMSetBlendState(blendState, NULL, 0xFFFFFF);

如果有帮助的话,这里有纹理描述:

D3D11_TEXTURE2D_DESC texDesc;
texDesc.Width = TextureWidth;
texDesc.Height = textureHeight;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.Usage = D3D11_USAGE_IMMUTABLE;
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
texDesc.CPUAccessFlags = 0;
texDesc.MiscFlags = 0;

我只使用了一个渲染目标,而不是在着色器中预乘Alpha。我到处寻找,并尝试了D3D11_BLEND_STATE的各种不同组合,但都没有效果。我能得到的最接近的结果是,当我将AlphaToCoverage设置为TRUE时,但如果我更改顶点的alpha,它就不起作用,而且我知道我正在做的事情AlphaToCoverage应该为FALSE。

我知道这是一个很老的问题,但我有一个类似的问题。

我要做的是确保在绘制之前设置/取消混合状态,然后在透明2d图像的绘制调用之后禁用。可以找到更多信息:DirectX图像纹理四边形显示透明的底层控件颜色

最新更新