2016-05-12 108 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; 

有你有它!乾杯!