DirectX Blending State проблема

У меня есть проблема, которую я не смог решить, поэтому я прошу вашей помощи.
Я разрабатываю приложение 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, она выглядит просто отлично:

Пока альфа равна 1, она выглядит просто отлично:
Но если я попытаюсь что-то изменить, любой цвет, который был до этого, изменится на черный:Но я пытаюсь это немного изменить, любой цвет, который был до этого, меняется на черный.
Я не очень понимаю, почему это происходит, и я прошу вашего руководства!
Заранее спасибо!

2

Решение

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

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

и после этого вы хотите установить смешивание цветов для смешивания:

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector