2016-05-12 10 views
2

私は解決できなかった問題があるので、私はあなたの助けを求める。 私のシーンにテキストのページが含まれており、ハイライトロジックを追加しようとしているDirectX Appを開発しています。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()); 

問題があり、 - それは、私はそれが仕事をしたい方法で動作しません。私はややそれを変更しようとした場合、

As long as alpha equals 1 it looks just fine: しかし - 黒に変わる前にした任意の色: は限りアルファが1に等しいとそれだけで正常に見えるこの出来事である理由But i try to change it somewhat, - any color that was before changes into black を私は本当に理解していないと私はあなたの指導を求める! ありがとうございます!

+0

レンダリングされたテキストの上にプレーンカラーの矩形をレンダリングしていますか?または、矩形はテキストでテクスチャを使用しますか?すべてが黒くなったとき、あなたは何を変えましたか?前と後のどちらの値を使用しましたか? – Gnietschow

+0

私はd3dを使用してハイライトをリールしています。私は、バッファ、シェーダなど に私はそれがブレンド状態が奇妙に見える0 1 0 1 、その後0 1 0 0.9 –

+0

たハイライトカラー にアルファ値を変更を作成しています。これがあなたが望むものだと確信していますか?通常、ソースと宛先のブレンドには 'SRC_ALPHA'と' INV_SRC_ALPHA'を使います。 –

答えて

0

よろしくお願いします。 誰もこの種の問題に苦しんでいる場合は、次のようにしてください:

まず、強調表示色をピクセルシェーダーに渡します。次に、この色のアルファ値を白色(ページの背景)と値の間の値として扱いたいとします。

ので、あなたのシェーダは、おそらくのようなものになります。

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; 

そしてそこにあなたがそれを持っているの!乾杯!

関連する問題