2016-05-12 16 views
2

Ich habe ein Problem, das ich nicht lösen konnte, also suche ich deine Hilfe. Ich entwickle eine DirectX-App, in der meine Szene eine Seite mit Text enthält und ich versuche, High-Light-Logik hinzuzufügen.DirectX Blending State Problem

Also ich möchte in der Lage sein, einen Text hervorzuheben und auch die Farbe \ Opazität dieser Hervorhebung zu ändern.

Um dies zu tun, versuche ich ID3D11BlendState zu verwenden. Bitte beachten Sie einen kleinen Code-Schnipsel auf, wie ich es schaffen:

 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()); 

Das Problem ist, - es ist nicht in einer Art und Weise arbeitet ich es arbeiten wollen. Solange Alpha gleich 1 sieht es ganz gut:

As long as alpha equals 1 it looks just fine: Aber wenn ich versuche, es etwas zu verändern, - jede Farbe, die vor Veränderungen in schwarz war: But i try to change it somewhat, - any color that was before changes into black Ich verstehe nicht wirklich, warum ist das passiert und Ich bitte um deine Führung! Vielen Dank im Voraus!

+0

Rendern Sie ein einfarbiges Rechteck über zuvor gerenderten Text? Oder verwendet das Rechteck eine Textur mit dem Text? Was genau hast du verändert, als alles schwarz wurde? Welche Werte haben Sie vorher und nachher verwendet? – Gnietschow

+0

Ich redere Highlight mit d3d. Ich erstelle Puffer, Shader und so weiter Ich ändere Alpha-Werte auf Highlight Farbe so war es 0 1 0 1 dann 0 1 0 0,9 –

+0

Dieser Mischzustand sieht seltsam aus. Bist du sicher, dass du das willst? Normalerweise verwenden Sie 'SRC_ALPHA' und' INV_SRC_ALPHA' für die Quell- und Zielmischung. –

Antwort

0

Ok, ich habe es funktioniert. Wenn jemand jemals mit dieser Art von Problem kämpfen würde, versuchen Sie Folgendes:

Erstens, übergeben Sie Ihre Highlight-Farbe in Pixel-Shader. Dann wollen Sie den Alpha-Wert dieser Farbe als einen Lerp-Wert zwischen weißer Farbe (Seitenhintergrund) und Ihrem Wert behandeln.

so würde Ihre Shader aussehen vermutlich so etwas wie:

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

und danach möchten Sie Ihren blendstate einstellen Farben multiplizieren:

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; 

Und dort haben Sie es! Prost!