2016-05-12 105 views
2

我有一个问题,我没有解决,所以我寻求你的帮助。 我正在开发一个DirectX应用程序,其中我的场景包含一个包含文本的页面,我试图添加higlighting逻辑。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()); 

的问题是 - 它不是在某种程度上,我希望它的工作的工作。 只要阿尔法等于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 我真的不明白为什么会出现这种情况和我请求你的指导! 提前谢谢!

+0

您是否在原先呈现的文本上渲染普通的彩色矩形?或者矩形在文本中使用纹理?当全部变黑时,你究竟发生了什么变化?你之前和之后使用了哪些值? – Gnietschow

+0

我正在使用d3d重新突出显示。我创建缓冲区,着色器等 我改变高亮颜色的alpha值 所以它是0 1 0 1 然后0 1 0 0.9 –

+0

这种混合状态看起来很奇怪。你确定这是你想要的吗?通常,您使用'SRC_ALPHA'和'INV_SRC_ALPHA'作为源和目标混合。 –

回答

0

好吧,我明白了。 如果有人会遇到这种问题,请尝试这样做:

首先,将高亮颜色传递给像素着色器。然后,您希望将此颜色的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; 

有你有它!干杯!