Direct X 11 Overlay - проблема с отображением текста - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть текущий проект, который использует DirectX 11 для наложения текста на внешнее окно (без внедрения чего-либо или использования каких-либо внутренних хуков API).Я создаю прозрачное окно и использую FW1FontWrapper для обработки фактического текста.Проблема, с которой я сталкиваюсь, состоит в том, что текст имеет артефакты и выглядит искаженным, в зависимости от текущего цвета окна, над которым я рисую.Когда окно светлое, оно делает текст практически нечитаемым, а рисование на темных фонах / окнах делает его в основном нормальным.

Пример того, о чем я говорю, см.следующие два изображения (текст поверх темных и светлых окон соответственно):

Text over dark- colored window (normal)

Text over light- colored window

Я предполагаю, что проблема находится где-тов моем коде инициализации Direct X.Либо это, либо смешивание альфа-каналов в тексте и нижележащем окне.Моя прямая X-реализация использует следующий код во время инициализации:

D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;

DXGI_SWAP_CHAIN_DESC scd;

// clear out the struct for use
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

// fill the swap chain description struct
scd.BufferCount = 1;                                    // one back buffer
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // use 32-bit color
scd.BufferDesc.Width = ScreenWidth;                     // set the back buffer width
scd.BufferDesc.Height = ScreenHeight;                   // set the back buffer height
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // how swap chain is to be used
scd.OutputWindow = handleWindow;                        // the window to be used
scd.SampleDesc.Count = 1;                               // how many multisamples
scd.Windowed = TRUE;    
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;     // allow full-screen switching  

D3D_FEATURE_LEVEL  FeatureLevelsSupported;

// create a device, device context and swap chain using the information in the scd struct
D3D11CreateDeviceAndSwapChain(NULL,
    D3D_DRIVER_TYPE_HARDWARE,
    NULL,
    0,
    &featureLevel,
    1,
    D3D11_SDK_VERSION,
    &scd,
    &m_pSwapchain,
    &m_pDevice,
    &FeatureLevelsSupported,
    &m_pContext);


// get the address of the back buffer
ID3D11Texture2D *pBackBuffer;
m_pSwapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);

// use the back buffer address to create the render target
m_pDevice->CreateRenderTargetView(pBackBuffer, NULL, &m_pBackBuffer);
pBackBuffer->Release();

// set the render target as the back buffer
m_pContext->OMSetRenderTargets(1, &m_pBackBuffer, NULL);

// Set the viewport
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

viewport.MinDepth = 0;
viewport.MaxDepth = 1;
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = ScreenWidth;
viewport.Height = ScreenHeight;

m_pContext->RSSetViewports(1, &viewport);

FW1FontWrapper инициализируется с использованием всех параметров по умолчанию.

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

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