DirectX 11 D3D11_BLEND_DESC - PullRequest
       46

DirectX 11 D3D11_BLEND_DESC

0 голосов
/ 04 февраля 2020

Я получил некоторые странные результаты при рендеринге текста в DirectX11 поверх других объектов. Каждый персонаж становится черным фоном (мой очищающий цвет). Если текст отображается непосредственно на фоне, все в порядке. Я использую im gui lib для рендеринга. Я думаю, что это вызвано неправильной настройкой смешивания - это мои настройки:

D3D11_BLEND_DESC desc;
desc.AlphaToCoverageEnable = false;
desc.IndependentBlendEnable = false;
desc.RenderTarget[0].BlendEnable = false;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_ZERO;
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

Это изображение, которое показывает проблему:

This is an image which shows the issue

Обновление № 1:

Это метод, который я использую для рисования строки: https://github.com/ocornut/imgui/blob/9cff4d6e5e76dd18d9c4ee7a1560563da2059a44/imgui_draw.cpp#L2937

Мой прозрачный цвет:

ImVec4 clearColor = ImVec4(0.f, 0.f, 0.f, 0.f);

С настройками ErnieDin go я получаю такой результат: Положительная часть: рамки вокруг каждого символа исчезли. Плохая часть: текст, который является очень размытым / нечетким, особенно если текст отображается на темном фоне / без фона.

Обновление № 2: это изображение, похоже, показывает проблему в двух словах: enter image description here Перекрывающаяся часть квадрата должна быть желтой, а не зеленой, как наверху. Первое изображение также показывает, что рассматривается только прозрачный фон шрифта, что приводит к странным полосам позади каждой буквы.

1 Ответ

0 голосов
/ 07 февраля 2020

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

Мой код в C#, но с теми же настройками DX. Вы можете попробовать это.

        blendStateDescription.RenderTarget[0].IsBlendEnabled = true;
        blendStateDescription.RenderTarget[0].SourceBlend = D3D11.BlendOption.SourceAlpha;
        blendStateDescription.RenderTarget[0].DestinationBlend = D3D11.BlendOption.InverseSourceAlpha; //
        blendStateDescription.RenderTarget[0].BlendOperation = D3D11.BlendOperation.Add;

        blendStateDescription.RenderTarget[0].SourceAlphaBlend = D3D11.BlendOption.SourceAlpha; //Zero
        blendStateDescription.RenderTarget[0].DestinationAlphaBlend = D3D11.BlendOption.InverseSourceAlpha;
        blendStateDescription.RenderTarget[0].AlphaBlendOperation = D3D11.BlendOperation.Maximum;

        blendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11.ColorWriteMaskFlags.All;

Я использую SourceAlpha и InverseSourcealpha, но я считаю, что использование Source as One и Destination as Zero также возможно. Но если вы ссылаетесь на страницу Microsoft DX по поводу смешивания, математика там публикуется.

Ответить в этой теме, если это не совсем работает. Я предполагаю, что ваша исходная текстура является текстурой RGBA, а альфа-компонент вашей текстуры равен 0, а фон также черный.

...