ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Решено … просто необходимо узнать, как альфа-смешение работает в глубине. Я должен был иметь:
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;
РЕДАКТИРОВАТЬ:
Вот немного визуализации …
* При отключенном рендеринге буквы точно совпадают (сравните 4 & 3)
* При рендеринге в backbuffer с включенным AB, буквы отображаются слегка (едва заметными) размытыми, но все еще смешиваются (сравните 4 & 1)
* При рендеринге на текстуру с включенным AB, буквы отрисовываются еще более заметно размытыми, не смешиваясь вообще. (сравнить 4 & 2)
Не уверен, почему цвета размыты с включенным альфа-смешиванием … но, может быть, это ключ?
РЕДАКТИРОВАТЬ:
Если очистить целевую текстуру рендеринга, чтобы сказать … 0.0f, 0.0f, 1.0f, 1.0f (RGBA, синий) … это результат:
Только пиксели с альфа> 0.0f & < 1.0f смешать с цветом. Еще одна подсказка, но я не знаю, как решить эту проблему …
Задача ещё не решена.
Других решений пока нет …