- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 395
- Реакции
- 8
На фоне того, как Apex окончательно переезжает на DX12, старые GDI и DX11 костыли начинают вызывать все больше вопросов. Если кто-то еще сидит на прозрачных окнах и удивляется задержкам или дропам FPS — этот материал для вас.
Нашел в закромах базу под DX12 рендер. Главная фишка здесь — использование DirectComposition. Это современный способ вывода оверлея, который работает через dcomp.dll. Метод позволяет избежать многих проблем с композицией окон и дает более чистый результат по сравнению с классическим TopMost оверлеем.
Что внутри:
Исходный код (Header-only style):
Заметки на полях:
Не забывайте, что это чистая база. Если собираетесь юзать в Apex, учитывайте, что EAC чекает хендлы окон и методы наложения. Для легитной игры DirectComposition подходит отлично, но если планируете рейдж — лучше смотреть в сторону DMA или кастомных драйверов для скрытия оверлея.
Кто уже перевел свои проекты на DX12, как ощущения от инпута по сравнению с DX11?
Нашел в закромах базу под DX12 рендер. Главная фишка здесь — использование DirectComposition. Это современный способ вывода оверлея, который работает через dcomp.dll. Метод позволяет избежать многих проблем с композицией окон и дает более чистый результат по сравнению с классическим TopMost оверлеем.
Что внутри:
- Минимальная реализация COM-интерфейсов DirectComposition (никаких лишних зависимостей из dcomp.h и конфликтов с D2D).
- Отрисовка базовых примитивов: линии, прямоугольники, круги (включая заполненные).
- Простенький батчинг вершин (FlushBatch) для минимизации вызовов отрисовки.
- Корректная работа с DX12 очередями, SwapChain и синхронизацией через Fences.
- Шейдеры (VS/PS) зашиты прямо в коде, никакой возни с внешними .hlsl файлами.
Рендер использует Upload-кучи (D3D12_HEAP_TYPE_UPLOAD), что для внешнего софта — золотой стандарт. Вершины и индексы мапятся напрямую. Для ESP и простых радаров производительности хватит с огромным запасом. Рендеринг идет через SwapChainForComposition, что позволяет оверлею быть частью рабочего стола без лишних перекрытий.
Исходный код (Header-only style):
Код:
#pragma once
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <d3d12.h>
#include <dxgi1_6.h>
#include <d3dcompiler.h>
#include <DirectXMath.h>
#include <wrl/client.h>
#include <vector>
#include <cmath>
#pragma comment(lib, "d3d12.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3dcompiler.lib")
using Microsoft::WRL::ComPtr;
using namespace DirectX;
// Minimal DirectComposition interfaces
MIDL_INTERFACE("FCEB6FBF-2DF0-4B2B-A05E-8760D3C20E4B")
IDCompositionVisual_Min : public IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE SetOffsetX(float offsetX) = 0;
virtual HRESULT STDMETHODCALLTYPE SetOffsetX2(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetOffsetY(float offsetY) = 0;
virtual HRESULT STDMETHODCALLTYPE SetOffsetY2(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetTransform(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetTransform2(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetTransformParent(IDCompositionVisual_Min*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetEffect(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetBitmapInterpolationMode(int) = 0;
virtual HRESULT STDMETHODCALLTYPE SetBorderMode(int) = 0;
virtual HRESULT STDMETHODCALLTYPE SetClip(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetClip2(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE SetContent(IUnknown* content) = 0;
virtual HRESULT STDMETHODCALLTYPE AddVisual(IDCompositionVisual_Min*, BOOL, IDCompositionVisual_Min*) = 0;
virtual HRESULT STDMETHODCALLTYPE RemoveVisual(IDCompositionVisual_Min*) = 0;
virtual HRESULT STDMETHODCALLTYPE RemoveAllVisuals() = 0;
virtual HRESULT STDMETHODCALLTYPE SetCompositeMode(int) = 0;
};
MIDL_INTERFACE("EACDD04C-117E-4E17-88F4-D1B12B0E13A1")
IDCompositionTarget_Min : public IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE SetRoot(IDCompositionVisual_Min* visual) = 0;
};
MIDL_INTERFACE("C37EA93A-E7AA-450D-B16F-9746CB0407F3")
IDCompositionDevice_Min : public IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE Commit() = 0;
virtual HRESULT STDMETHODCALLTYPE WaitForCommitCompletion() = 0;
virtual HRESULT STDMETHODCALLTYPE GetFrameStatistics(void*) = 0;
virtual HRESULT STDMETHODCALLTYPE CreateTargetForHwnd(HWND hwnd, BOOL topmost, IDCompositionTarget_Min** target) = 0;
virtual HRESULT STDMETHODCALLTYPE CreateVisual(IDCompositionVisual_Min** visual) = 0;
};
typedef HRESULT(WINAPI* PFN_DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID iid, void** dcompositionDevice);
namespace DX12 {
// Implementation of Renderer class goes here...
// Full source available in the provided dump.
}
Заметки на полях:
Не забывайте, что это чистая база. Если собираетесь юзать в Apex, учитывайте, что EAC чекает хендлы окон и методы наложения. Для легитной игры DirectComposition подходит отлично, но если планируете рейдж — лучше смотреть в сторону DMA или кастомных драйверов для скрытия оверлея.
Кто уже перевел свои проекты на DX12, как ощущения от инпута по сравнению с DX11?