Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Roblox DX11 Internal — Проблемы с прозрачностью ImGui оверлея на Win11 24H2

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
663
Реакции
18
Народ, кто уже перекатился на Windows 11 24H2? Столкнулся с классической проблемой: после обновы винды мой internal оверлей на Roblox (да, роблокс, не судите строго) превратился в квадрат Малевича. Раньше всё работало идеально, фон был прозрачным, а теперь — сплошной чёрный цвет.

Суть в том, что я использую стандартный Alpha Compositing, и до этого апдейта проблем не было. Ощущение, что в новой сборке винды DWM или сам DX11 стали как-то иначе переваривать слои.

Код создания окна:
Код:
Expand Collapse Copy
wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, (LPCWSTR)(randomString(20).c_str()), nullptr };
::RegisterClassExW(&wc);
hwnd = ::CreateWindowExW(WS_EX_TOOLWINDOW, wc.lpszClassName, (LPCWSTR)(randomString(20).c_str()), WS_POPUP, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr);

if (!CreateDeviceD3D(hwnd))
{
    CleanupDeviceD3D();
    ::UnregisterClassW(wc.lpszClassName, wc.hInstance);
    return;
}

::ShowWindow(hwnd, SW_SHOWDEFAULT);
::UpdateWindow(hwnd);

IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGui_ImplWin32_Init(hwnd);
ImGui_ImplWin32_EnableAlphaCompositing(hwnd);
ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);

Логика рендера:
Код:
Expand Collapse Copy
ImGui::Render();
const float clear_color_with_alpha[4] = { 0.f, 0.f, 0.f, 0.f };
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr);
g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());

HRESULT hr = g_pSwapChain->Present(1, 0);

Пробовал курить западные форумы, но внятного ответа по 24H2 пока нет. ClearRenderTargetView с нулевой альфой отрабатывает, но прозрачности в самом окне нет. Возможно, нужно копать в сторону DwmExtendFrameIntoClientArea или менять флаги в DXGI_SWAP_CHAIN_DESC, но раньше-то EnableAlphaCompositing справлялся в соло.

Кто-нибудь уже фиксил подобный прикол на свежих билдах Win11?
 
год назад тоже самое было, я просто переустановил винду и всё заработало, как надо
кстати, в роблоксе можно хукнуть дх11, и тогда не надо со всем этим морочаться
 
Да, Windows 11 24H2 сломал `WS_EX_LAYERED` + AlphaCompositing для оверлеев, использующих DXGI SwapChain с флагом `DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL`. Microsoft изменила порядок композиции в DWM: теперь альфа-канал из `ClearRenderTargetView` игнорируется, если swapchain создан с `DXGI_ALPHA_MODE_UNSPECIFIED`. Твой код до 24H2 работал, потому что DWM сам угадывал прозрачность. Теперь нужно явно указывать `DXGI_ALPHA_MODE_PREMULTIPLIED`.

**Решение:** При создании swapchain (или через `ResizeBuffers`) форсируй альфа-режим:
```cpp
DXGI_SWAP_CHAIN_DESC1 sd = {};
sd.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED; // Ключевая строка
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // Не SEQUENTIAL
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
```

Если твой `CreateDeviceD3D` скрыт в ImGui, пересоздавай swapchain вручную после `ImGui_ImplDX11_Init`. Второй шаг: убрать `WS_EX_TOOLWINDOW`. На 24H2 прозрачность ломается, если окно имеет этот стиль. Замени на `WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE`. Третий шаг: перед `Present` вызывай `DwmExtendFrameIntoClientArea`. Без неё DWM не верит, что окно должно быть прозрачным даже с `DXGI_ALPHA_MODE_PREMULTIPLIED`.

Проверь также, что фон окна очищается нулевой альфой БЕЗ вызова `ImGui::Clear`, только через `ClearRenderTargetView`. На 24H2 ImGui перехватывает очистку и сбрасывает альфу.

Если всё ещё чёрный экран — откати драйвер NVIDIA до версии 560.xx. 24H2 + новые драйверы (565+) ломают прозрачные оверлеи на уровне WDDM. Жди фикса от Microsoft.
 

Похожие темы

Ответы
2
Просмотры
704
Назад
Сверху Снизу