reven86 Posted September 6, 2019 Share Posted September 6, 2019 Расскажу как можно выводить графику в игре, работая напрямую с Direct3D 11. Как это работает - мы подменяем несколько стандартных методов D3D11, чтобы получить Device и SwapChain, подменяем метод Present, и рисуем в конце кадра то, что хотим. Метод работает не зависимо от конкретного приложения и подходит для других игр. Более подробно: 1. Создаем прокси dxgi.dll, где переопределяем метод CreateDXGIFactory 2. В CreateDXGIFactory получаем интерфейс IDXGIFactory и меняем виртуальную таблицу, подменяем функцию CreateSwapChain на нашу собственную 3. В CreateSwapChain получаем объект ID3D11Device и также меняем виртуальную таблицу, подменяя функции интерфейса IDXGISwapChain Present и ResizeBuffers на наши собственные. 4. В этот момент, когда у нас есть и IDXGISwapChain и ID3D11Device можно загрузить все необходимые ресурсы (создать модели, загрузить шейдеры). 5. В методе Present рисуем нашу дополнительную геометрию. Пример, поместить файлы dxgi.dll и shaders.shader в папку с игрой. В примере рисуется треугольник поверх игры с инверсией цветов. .overlay_D3D11.zip Исходники (Visual Studio 2017) overlay_src.zip 8 @ Quote Link to comment Short link Share on other sites More sharing options...
Mixaill Posted September 6, 2019 Share Posted September 6, 2019 By the way, в XFW.Native есть централизованная подписка на IDXGISwapChain::Present() без проксирования DXGI Пример с выводом демки ImGUI: https://gitlab.com/xvm/xfw/xfw-example-d3dhook 5 @ Quote Link to comment Short link Share on other sites More sharing options...
Pavel3333 Posted September 7, 2019 Share Posted September 7, 2019 06.09.2019 в 12:23, reven86 сказал: нашу дополнительную геометрию давно хотел универсализацию работы с моделями, дабы подгружать простецкие примитивы в любую игру WG из кастомного формата. Но что там со светом? Можно ли освещать дополнительную геометрию от источников освещения игры? @ Quote Link to comment Short link Share on other sites More sharing options...
reven86 Posted September 8, 2019 Author Share Posted September 8, 2019 07.09.2019 в 01:54, Mixaill сказал: By the way, в XFW.Native есть централизованная подписка на IDXGISwapChain::Present() без проксирования DXGI Круто. Получается я велосипед сделал) 17 часов назад, Pavel3333 сказал: давно хотел универсализацию работы с моделями, дабы подгружать простецкие примитивы в любую игру WG из кастомного формата. Но что там со светом? Можно ли освещать дополнительную геометрию от источников освещения игры? Это возможно только если рисовать геометрию в нужный момент внутри rendering pipeline, а не в конце кадра, как у меня в примере. Приэтом нужно знать в каких константных буфферах передается информация об освещении (а в идеале использовать шейдеры самой игры) и какие данные должен выводить шейдер. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
yepev Posted June 17 Share Posted June 17 В 07.09.2019 в 02:54, Mixaill сказал: https://gitlab.com/xvm/xfw/xfw-example-d3dhook Умерла ссылка, ещё жив этот пример? Я так понял, в этих репах надо копать? https://gitlab.com/xvm/xvm-components/xfw.native https://gitlab.com/xvm/xvm-components/xfw.native.hooks 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Mixaill Posted June 24 Share Posted June 24 (edited) 17.06.2024 в 15:50, yepev сказал: Умерла ссылка, ещё жив этот пример? Я так понял, в этих репах надо копать? https://gitlab.com/xvm/xvm-components/xfw.native https://gitlab.com/xvm/xvm-components/xfw.native.hooks Поищу конкретный пример, но похожее по смыслу тут (мод для снятия видео с клиента, похоже на NVIDIA ShadowPlay) https://gitlab.com/openwg/wot.video/-/blob/master/src/native/core/wot_video_video_capture.cpp?ref_type=heads#L480 Edited June 24 by Mixaill 2 @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.