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

Исходник [Сурс] Apex Legends DX12 Renderer — DirectComposition Overlay

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
395
Реакции
8
На фоне того, как Apex окончательно переезжает на DX12, старые GDI и DX11 костыли начинают вызывать все больше вопросов. Если кто-то еще сидит на прозрачных окнах и удивляется задержкам или дропам FPS — этот материал для вас.

Нашел в закромах базу под DX12 рендер. Главная фишка здесь — использование DirectComposition. Это современный способ вывода оверлея, который работает через dcomp.dll. Метод позволяет избежать многих проблем с композицией окон и дает более чистый результат по сравнению с классическим TopMost оверлеем.

Что внутри:
  1. Минимальная реализация COM-интерфейсов DirectComposition (никаких лишних зависимостей из dcomp.h и конфликтов с D2D).
  2. Отрисовка базовых примитивов: линии, прямоугольники, круги (включая заполненные).
  3. Простенький батчинг вершин (FlushBatch) для минимизации вызовов отрисовки.
  4. Корректная работа с DX12 очередями, SwapChain и синхронизацией через Fences.
  5. Шейдеры (VS/PS) зашиты прямо в коде, никакой возни с внешними .hlsl файлами.

Рендер использует Upload-кучи (D3D12_HEAP_TYPE_UPLOAD), что для внешнего софта — золотой стандарт. Вершины и индексы мапятся напрямую. Для ESP и простых радаров производительности хватит с огромным запасом. Рендеринг идет через SwapChainForComposition, что позволяет оверлею быть частью рабочего стола без лишних перекрытий.

Исходный код (Header-only style):
Код:
Expand Collapse Copy
#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?
 
Назад
Сверху Снизу