c++ - DirectX 混合状态问题

标签 c++ directx blending

我有一个问题我没能解决,所以我寻求你的帮助。 我正在开发一个 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());

问题是,- 它没有按照我希望的方式工作。 只要 alpha 等于 1,它看起来就很好:

As long as alpha equals 1 it looks just fine: 但是如果我尝试稍微改变它,- 之前的任何颜色都会变成黑色:But i try to change it somewhat, - any color that was before changes into black 我真的不明白为什么会这样,我请求你的指导!。 提前致谢!

最佳答案

好的,我让它工作了。 万一有人遇到这种问题,请尝试这样做:

首先,将高亮颜色传递给像素着色器。然后,您希望将该颜色的 alpha 值视为白色(页面背景)和您的值之间的插值。

所以你的着色器大概看起来像这样:

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;
}

然后你想设置你的混合状态来增加颜色:

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;

关于c++ - DirectX 混合状态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37190163/

相关文章:

c++ - 使用消息堆栈制作一个外观精美的窗口

c++ - 准确评估 1/1 + 1/2 + ... 1/n 行

c++ - 使用 Direct2D 和 DirectWrite(C++、DirectX)制作按钮

c++ - 如何确保我的 direct3d 应用程序每次都能在任何 PC 上运行

C++动画光标

c++ - DX12 : Is there a way to extract any information from a PSO?

processing - P5.js : manually calculate additive blendmode with pixels[]

python - 是否可以使用 matplotlib 进行加法混合?

iPhone OpenGL ES 2.0 与 Cocos2D 混合给出了意想不到的结果

c++ - 如何在qt中同时移动滚动条