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