Jump to content
Korean Random

Вывод графики через оверлей Direct3D 11


reven86

Recommended Posts

Расскажу как можно выводить графику в игре, работая напрямую с Direct3D 11.

 

spacer.png

 

Как это работает - мы подменяем несколько стандартных методов 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

  • Upvote 8
Link to comment
Short link
Share on other sites

06.09.2019 в 12:23, reven86 сказал:

нашу дополнительную геометрию

давно хотел универсализацию работы с моделями, дабы подгружать простецкие примитивы в любую игру WG из кастомного формата. Но что там со светом? Можно ли освещать дополнительную геометрию от источников освещения игры?

Link to comment
Short link
Share on other sites

07.09.2019 в 01:54, Mixaill сказал:

By the way, в XFW.Native есть централизованная подписка на IDXGISwapChain::Present() без проксирования DXGI

 

Круто. Получается я велосипед сделал)

 

17 часов назад, Pavel3333 сказал:

давно хотел универсализацию работы с моделями, дабы подгружать простецкие примитивы в любую игру WG из кастомного формата. Но что там со светом? Можно ли освещать дополнительную геометрию от источников освещения игры?

 

Это возможно только если рисовать геометрию в нужный момент внутри rendering pipeline, а не в конце кадра, как у меня в примере. Приэтом нужно знать в каких константных буфферах передается информация об освещении (а в идеале использовать шейдеры самой игры) и какие данные должен выводить шейдер.

  • Upvote 1
Link to comment
Short link
Share on other sites

  • 4 years later...
17.06.2024 в 15:50, yepev сказал:

Умерла ссылка, ещё жив этот пример?

 

Я так понял, в этих репах надо копать?

 

Поищу конкретный пример, но похожее по смыслу тут (мод для снятия видео с клиента, похоже на NVIDIA ShadowPlay)

 

https://gitlab.com/openwg/wot.video/-/blob/master/src/native/core/wot_video_video_capture.cpp?ref_type=heads#L480

Edited by Mixaill
  • Upvote 2
Link to comment
Short link
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...