首页 > 解决方案 > 使用低 Alpha 值时的 Alpha 混合问题

问题描述

我知道这个问题可能看起来很傻,但是在使用 alpha 通道值混合纹理时遇到问题,如果我的 alpha 值从 1.0 变为接近 0.501,则对象会慢慢消失,一旦达到 0.5 或更低,它就会消失。这是两个显示它的打印屏幕: 在此处输入图像描述

Alpha 设置为 0.501 在此处输入图像描述 Alpha 设置为 0.5

我希望即使在 0.1 alpha 左右也能看到上面的树,即使它几乎不可见并且大部分是透明的,而不是突然消失。以下是我当前的混合状态代码:

D3D11_BLEND_DESC bd;
ZeroMemory(&bd, sizeof(D3D11_BLEND_DESC));

bd.RenderTarget->BlendEnable = true;
bd.AlphaToCoverageEnable = true;
bd.RenderTarget->RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
bd.RenderTarget->SrcBlend = D3D11_BLEND_SRC_ALPHA;

bd.RenderTarget->DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
bd.RenderTarget->SrcBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA;
bd.RenderTarget->DestBlendAlpha = D3D11_BLEND_ONE;
bd.RenderTarget->BlendOp = D3D11_BLEND_OP_ADD;
bd.RenderTarget->BlendOpAlpha = D3D11_BLEND_OP_ADD;

hr = m_pDevice->CreateBlendState(&bd, &m_pBlendStateON);
if (FAILED(hr))
    return Log("Failed to create blend state."); // Log is just a function to register errors on my app.

我的混合因子定义如下:float BlendFactor[4] = { 0,0,0,0 };,我的示例蒙版使用默认值UINT SampleMask = 0xffffffff;

如果有人知道我可以做些什么来使透明度从 1.0f 缓慢衰减到 0.0f 值,那将是一个很大的帮助。

编辑:我发现如果我禁用AlphaToCoverageEnable它,它不会剔除颜色,直到它达到 0.0f alpha 值,但不知道该怎么做,因为我需要,AlphaToCoverageEnable否则树枝上的这个方块会出现,有什么办法可以改变阈值,所以AlphaToCoverageEnable只有在 alpha 实际上是 0.0f 时才剔除颜色?

标签: c++directx-11

解决方案


推荐阅读