2y ago · Jul 18, 2024 7:40 PM
Here is a reference snippet for hooking to draw Dear ImGui overlays seamlessly on top of any DirectX 11 game:
Always release your on ResizeBuffers if the game window resolution changes!
CPP
IDXGISwapChain::Present CPP
#include <d3d11.h>
#include "imgui.h"
#include "imgui_impl_win32.h"
#include "imgui_impl_dx11.h"
typedef HRESULT(__stdcall* Present_t)(IDXGISwapChain*, UINT, UINT);
Present_t oPresent = nullptr;
ID3D11Device* g_pd3dDevice = nullptr;
ID3D11DeviceContext* g_pd3dDeviceContext = nullptr;
ID3D11RenderTargetView* g_mainRenderTargetView = nullptr;
bool g_bInitialized = false;
HRESULT __stdcall Hooked_Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags) {
if (!g_bInitialized) {
if (SUCCEEDED(pSwapChain->GetDevice(__uuidof(ID3D11Device), (void**)&g_pd3dDevice))) {
g_pd3dDevice->GetImmediateContext(&g_pd3dDeviceContext);
ID3D11Texture2D* pBackBuffer;
pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView);
pBackBuffer->Release();
DXGI_SWAP_CHAIN_DESC sd;
pSwapChain->GetDesc(&sd);
ImGui::CreateContext();
ImGui_ImplWin32_Init(sd.OutputWindow);
ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
g_bInitialized = true;
}
}
// Render Loop
ImGui_ImplDX11_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
// Draw Custom ESP Overlay here
ImDrawList* bg = ImGui::GetBackgroundDrawList();
bg->AddText(ImVec2(20, 20), IM_COL32(0, 255, 255, 255), "[UnreliableCode] DX11 Overlay Active");
ImGui::Render();
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
return oPresent(pSwapChain, SyncInterval, Flags);
}Always release your
CPP
g_mainRenderTargetView
VectorByte | DirectX 11/12 Hooking & ImGui Overlays
Quote
Math is the language of game engines.
The following users thanked VectorByte for this post: