2016-05-12 10 views
2

У меня проблема, которую я не смог решить, поэтому я обращаюсь к вам за помощью. Я разрабатываю приложение DirectX, в котором на моей сцене есть страница с текстом на ней, и я пытаюсь добавить логику подсчета.DirectX Blending State issue

Так что я хочу, чтобы выделить текст, а также изменить цвет подсветки подсветки.

Для этого я пытаюсь использовать 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. я создаю буферы, шейдеры и так далее я изменить значения альфа на цвет подсветки так было 0 1 0 1 затем 0 1 0 0,9 –

+0

Это смесь состояние выглядит странно. Вы уверены, что это то, что вы хотите? Обычно вы используете 'SRC_ALPHA' и' INV_SRC_ALPHA' для смеси источника и назначения. –

ответ

0

Хорошо, я получил его работу. В случае, если кто-либо будет бороться с такой проблемой, попробуйте сделать это:

Во-первых, передайте цвет подсветки в пиксельный шейдер. Затем вы хотите обработать альфа-значение этого цвета как значение 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; 

А что у вас есть! Ура!

 Смежные вопросы

  • Нет связанных вопросов^_^