DX11 Альфа-смешение при рендеринге на текстуру

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Решено … просто необходимо узнать, как альфа-смешение работает в глубине. Я должен был иметь:
oBlendStateDesc.RenderTarget [a] .DestBlendAlpha = D3D11_BLEND_ZERO;
… установите D3D11_BLEND_ONE, чтобы сохранить альфа.

При рендеринге в буферный буфер однажды проблема не будет замечена, так как цвета смешиваются нормально, и это окончательный результат. При рендеринге к текстуре применяется то же самое, только тогда, когда рендеринг текстуры в буферный буфер, неправильная альфа играет роль в неправильном смешивании текстуры в буферный буфер.

Затем я столкнулся с другой проблемой, когда альфа, казалось, уменьшалась. Это потому, что цвет смешивается дважды, например …

Source.RBGA = 1.0f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f

Визуализация в текстуру …

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = 0.5f, 0.0f, 0.0f
Result.A   = Source.A * 1 + Dest.A * 1 = 0.5f

Сейчас…

Source.RBGA = 0.5f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f

Визуализировать в backbuffer …

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = 0.25f, 0.0f, 0.0f
Result.A = Source.A * 1 + Dest.A * 1 = 0.5f

Чтобы решить эту проблему, при рендеринге текстуры в буферный буфер я использую то же самое blendstate, но меняю SrcBlend на D3D11_BLEND_ONE, чтобы цвет не смешивался дважды.

Надеюсь, это поможет кому-то еще, имеющему подобную проблему ….

EDITEND

Чтобы повысить производительность, я пытаюсь визуализировать строку текста, которая никогда не превращается в текстуру, чтобы каждый раз сохранять рендеринг каждого отдельного символа.

Так как я рендеринг строго в 2D, я отключил глубину & тестирование трафарета при включении альфа-смешивания.

Проблема в том, что, кажется, не происходит никакого альфа-смешения, что бы ни рисовалось последним, перезаписывает текущий пиксель своими собственными данными … без смешения.

Я использую одно смешанное состояние, которое я не изменяю. При рендеринге в backbuffer смешивание работает нормально. При рендеринге окончательной текстуры в буферный буфер смешивание также работает нормально. Просто когда я рендеринг текстуры, смешивание кажется неудачным.

Вот как я настроил свое состояние с одной смесью:

D3D11_BLEND_DESC oBlendStateDesc;

oBlendStateDesc.AlphaToCoverageEnable = 0;
oBlendStateDesc.IndependentBlendEnable = 0; //set to false, dont need loop below... but just incase

for (unsigned int a = 0; a < 8; ++a)
{
oBlendStateDesc.RenderTarget[a].BlendEnable = 1;
oBlendStateDesc.RenderTarget[a].SrcBlend = D3D11_BLEND_SRC_ALPHA;
oBlendStateDesc.RenderTarget[a].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
oBlendStateDesc.RenderTarget[a].BlendOp = D3D11_BLEND_OP_ADD;
oBlendStateDesc.RenderTarget[a].SrcBlendAlpha = D3D11_BLEND_ONE;
oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO;
oBlendStateDesc.RenderTarget[a].BlendOpAlpha = D3D11_BLEND_OP_ADD;
oBlendStateDesc.RenderTarget[a].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
}

// Create the blend state from the description
HResult = m_poDevice->CreateBlendState(&oBlendStateDesc, &m_poBlendState_Default);

m_poDeviceContext->OMSetBlendState(m_poBlendState_Default, nullptr, 0xffffff);

Есть ли какие-то дополнительные шаги, которые я пропускаю, чтобы включить смешивание при рендеринге в текстуру?

РЕДАКТИРОВАТЬ: Если я установлю AlphaToCoverageEnable на true, он смешивается, но выглядит ужасно. Это, по крайней мере, подтверждает, что он использует одно и то же состояние наложения … просто работает по-разному в зависимости от того, когда рендеринг выполняется в буфер или текстуру: / Вот мой текстурный деск …

m_oTexureDesc.Width = a_oDesc.m_uiWidth;
m_oTexureDesc.Height = a_oDesc.m_uiHeight;
m_oTexureDesc.MipLevels = 1;
m_oTexureDesc.ArraySize = 1;
m_oTexureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
m_oTexureDesc.SampleDesc.Count = 1; //No sampling
m_oTexureDesc.SampleDesc.Quality = 0;
m_oTexureDesc.Usage = D3D11_USAGE_DEFAULT; //GPU writes & reads
m_oTexureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
m_oTexureDesc.CPUAccessFlags = 0;
m_oTexureDesc.MiscFlags = 0;

РЕДАКТИРОВАТЬ:
Вот немного визуализации …
Текст

  1. Рендеринг в буферный буфер — AlphaBlending включен.
  2. Рендеринг в текстуру — AlphaBlending включен.
  3. Рендеринг в буферный буфер — AlphaBlending отключен.
  4. Буква T взята из файла шрифта

* При отключенном рендеринге буквы точно совпадают (сравните 4 & 3)

* При рендеринге в backbuffer с включенным AB, буквы отображаются слегка (едва заметными) размытыми, но все еще смешиваются (сравните 4 & 1)

* При рендеринге на текстуру с включенным AB, буквы отрисовываются еще более заметно размытыми, не смешиваясь вообще. (сравнить 4 & 2)

Не уверен, почему цвета размыты с включенным альфа-смешиванием … но, может быть, это ключ?

РЕДАКТИРОВАТЬ:
Если очистить целевую текстуру рендеринга, чтобы сказать … 0.0f, 0.0f, 1.0f, 1.0f (RGBA, синий) … это результат:
введите описание изображения здесь

Только пиксели с альфа> 0.0f & < 1.0f смешать с цветом. Еще одна подсказка, но я не знаю, как решить эту проблему …

3

Решение

Задача ещё не решена.

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

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