【问题标题】:DirectX Blending State issueDirectX 混合状态问题
【发布时间】:2016-05-12 14:37:30
【问题描述】:

我有一个未能解决的问题,所以我寻求您的帮助。 我正在开发一个 DirectX 应用程序,其中我的场景包含一个带有文本的页面,并且我正在尝试添加高亮显示逻辑。

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

为了做到这一点,我正在尝试使用 ID3D11BlendState。请考虑一些关于我如何创建它的代码 sn-p:

        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,它看起来就很好:

但是,如果我尝试对其进行一些更改,-之前的任何颜色都会变成黑色: 我真的不明白为什么会这样,我请求你的指导! 提前谢谢!

【问题讨论】:

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

标签: c++ directx blending


【解决方案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;
}

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

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;

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多