Захват кадра в прямом режиме (Nvidia)

Мне нужно захватить кадр из приложения, работающего в прямом режиме, в D3D11Texture2D. Обычно я выполнял это, перехватывая Present() или Present1(), но теперь некоторые приложения (например, игры SteamVR, игры OVR и т. д.) выводят кадры в прямой режим (Nvidia и AMD открыли эту функцию для виртуальной реальности).

У кого-нибудь есть какие-либо идеи?


person Svyatoslav Krasnitskiy    schedule 05.04.2017    source источник
comment
Возможно, вам следует подключить устройство DX12.   -  person VuVirt    schedule 06.04.2017
comment
Да, пробовал, но нет вызовов Present1() и вообще нет доступа к swapchain. Прямой режим дает интерфейс для обработки вывода на уровне драйвера, и я не знаю, как захватить текстуру кадра.   -  person Svyatoslav Krasnitskiy    schedule 06.04.2017
comment
Можете ли вы попробовать FRAPS, чтобы увидеть, может ли он захватывать кадры? Если это возможно, то есть способ, и я постараюсь помочь вам в этом.   -  person VuVirt    schedule 06.04.2017
comment
Возможно, вам следует попробовать перехватить CreateSwapChainForHwnd и периодически использовать буфер цепочки подкачки или также перехватить другие методы, такие как ID3D12Fence Signal или SetEventOnCompletion, и взять в них резервный буфер цепочки подкачки.   -  person VuVirt    schedule 06.04.2017
comment
Вы также можете подключить методы ID3D12GraphicsCommandList, такие как Close или ResourceBarrier, чтобы получить оттуда цель рендеринга.   -  person VuVirt    schedule 06.04.2017
comment
Доступа к свопчейну нет. Если приложение использует прямой режим, оно отправляет данные прямо во фронтбуфер, но спасибо, я попробую подключить ResourceBarrier.   -  person Svyatoslav Krasnitskiy    schedule 06.04.2017
comment
Возможно, вам нужно подключить как ResourceBarrier, так и Close. Вы можете взять цель рендеринга при вызове ResourceBarrier, а затем скопировать буфер при вызове Close. Мне будет любопытно узнать, работает ли он, когда вы его протестируете.   -  person VuVirt    schedule 06.04.2017
comment
Я справился. Я получил ID3D11Device и ID3D11Context и поймал цели рендеринга. Я исследовал вызовы API оригинального процесса и обнаружил множество вариантов на этапе OM. Благодарю вас!   -  person Svyatoslav Krasnitskiy    schedule 29.09.2017


Ответы (1)


Чтобы решить эту проблему, я погрузился в этап Output-Merge в графическом конвейере. Я обнаружил, что все, что мне нужно, это Render Target(s). Несколько целей рендеринга возможны для реализации мультибуферизации.

person Svyatoslav Krasnitskiy    schedule 12.10.2017