C++ DirectX混合状态问题

C++ DirectX混合状态问题,c++,directx,blending,C++,Directx,Blending,我有个问题没能解决,所以我寻求你的帮助。 我正在开发一个DirectX应用程序,其中我的场景包含一个带有文本的页面,我正在尝试添加照明逻辑 因此,我希望能够突出显示文本,并更改此突出显示的颜色\不透明度 为此,我尝试使用ID3D11BlendState。请考虑一个关于我如何创建它的小代码片段: HRESULT hr = S_OK; D3D11_BLEND_DESC blendDesc; D3D11_RENDER_TARGET_BLEND_DESC

我有个问题没能解决,所以我寻求你的帮助。 我正在开发一个DirectX应用程序,其中我的场景包含一个带有文本的页面,我正在尝试添加照明逻辑

因此,我希望能够突出显示文本,并更改此突出显示的颜色\不透明度

为此,我尝试使用ID3D11BlendState。请考虑一个关于我如何创建它的小代码片段:

        HRESULT hr = S_OK;
        D3D11_BLEND_DESC blendDesc;
        D3D11_RENDER_TARGET_BLEND_DESC rtBlend;
        Microsoft::WRL::ComPtr<ID3D11BlendState> state;
        auto d3dDev = this->dxDevMt.GetD3DDevice();

        rtBlend.BlendEnable = TRUE;
        rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
        rtBlend.DestBlend = D3D11_BLEND_ZERO;
        rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
        rtBlend.SrcBlendAlpha = D3D11_BLEND_ONE;
        rtBlend.DestBlendAlpha = D3D11_BLEND_ZERO;
        rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
        rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

        blendDesc.AlphaToCoverageEnable = FALSE;
        blendDesc.IndependentBlendEnable = FALSE;

        for (auto &i : blendDesc.RenderTarget) {
            i = rtBlend;
        }

        hr = d3dDev->CreateBlendState(&blendDesc, state.GetAddressOf());
HRESULT hr=S_正常;
D3D11混合料描述混合料;
D3D11_RENDER_TARGET_BLEND_DESC rtBlend;
微软::WRL::ComPtr状态;
auto d3dDev=this->dxDevMt.GetD3DDevice();
rtBlend.BlendEnable=TRUE;
rtBlend.SrcBlend=D3D11\u BLEND\u DEST\u COLOR;
rtBlend.DestBlend=D3D11\u BLEND\u零;
rtBlend.BlendOp=D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha=D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha=D3D11\u BLEND\u零;
rtBlend.BlendOpAlpha=D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask=D3D11\u颜色\u写入\u启用\u全部;
blendDesc.AlphaToCoverageEnable=假;
blendDesc.IndependentBlendEnable=FALSE;
用于(自动&i:Blendesc.RenderTarget){
i=rtBlend;
}
hr=d3dDev->CreateBlendState(&blendDesc,state.GetAddressOf());
问题是,-它没有按我希望的方式工作。 只要alpha等于1,看起来就可以了:

但如果我试着改变一下,-之前的任何颜色都会变成黑色: 我真的不明白为什么会这样,我请求你的指导!。 提前谢谢你

好的,我让它工作了。 如果有人会遇到此类问题,请尝试这样做:

首先,将高光颜色传递到像素着色器中。然后,您需要将此颜色的alpha值视为白色(页面背景)和您的值之间的lerp值

因此,您的着色器可能看起来像:

cbuffer Buf0 : register(b0){
    float4 Color;
}

struct PsInput{
    float4 pos : SV_POSITION;
};

float4 main(PsInput input) : SV_TARGET{
    float4 color2 = lerp(float4(1,1,1,1), Color, Color.a);
    return color2;
}
然后,您要将blendstate设置为“倍增颜色”:

rtBlend.BlendEnable = TRUE;
rtBlend.SrcBlend = D3D11_BLEND_DEST_COLOR;
rtBlend.DestBlend = D3D11_BLEND_ZERO;
rtBlend.BlendOp = D3D11_BLEND_OP_ADD;
rtBlend.SrcBlendAlpha = D3D11_BLEND_ZERO;// D3D11_BLEND_ONE;
rtBlend.DestBlendAlpha = D3D11_BLEND_ONE;// D3D11_BLEND_ZERO;
rtBlend.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtBlend.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

blendDesc.AlphaToCoverageEnable = FALSE;
blendDesc.IndependentBlendEnable = FALSE;

是否在以前渲染的文本上渲染纯彩色矩形?或者矩形是否与文本一起使用纹理?当一切都变黑时,你到底改变了什么?您在使用之前和之后使用了哪些值?我正在使用d3d重新设置高光。我正在创建缓冲区、着色器等,我更改了高光颜色上的alpha值,使其为0 1 0 1,然后为0 1 0 0。9混合状态看起来很奇怪。你确定这就是你想要的吗?通常,您使用
SRC_ALPHA
INV_SRC_ALPHA
进行源代码和目标代码的混合。@NicoSchertler嗯,问题是,我希望黑色字母位于突出显示的顶部。你所建议的并不能切掉它。啊,你是在文本顶部乘以高光。我无法解释为什么颜色变成灰色。但是我很确定你不会得到一个同样使用alpha的单通道解决方案。难道你不能在文本下面画一个高光,然后使用通常的alpha混合吗?