Direct3D крючок наложения - PullRequest
       19

Direct3D крючок наложения

1 голос
/ 20 января 2011

Я пытаюсь добиться эффекта, подобного программе Fraps, которая накладывается поверх игры, и для этого я перехватываю функцию IDirect3DDevice9::EndScene и выполняю рендеринг перед вызовом исходной функции. Однако, когда я рендерим вещи, они портят эффекты, которые уже нарисованы в игре, и не рисуют себя правильно. Мой крючок просто выглядит как

HRESULT __stdcall endscene_hook(IDirect3DDevice9* id3d_device) {
    if (pGameOverlay) {
         pGameOverlay->Render();
    }

    return endscene_orig(dev);
}

, где pGameOverlay - это просто указатель на класс, чей метод Render просто рисует некоторые вещи на устройстве, с которым он был настроен ранее (не показан). Есть ли что-то еще, что я должен делать?

Я где-то читал, что Fraps на самом деле перехватывает метод Present вместо EndScene. Это правильно, и если да, то почему? И вы не можете иметь только одну BeginScene / EndScene пару между вызовами на Present?

1 Ответ

4 голосов
/ 20 января 2011

Вы можете определенно иметь несколько BeginScene/EndScene для каждого подарка, и это на самом деле довольно распространенная практика.Обычно пара BeginScene/EndScene используется для каждой отдельной цели рендеринга.(Одним из примеров дополнительной цели рендеринга может быть зеркало, но существует множество других применений для нескольких целей рендеринга, таких как теневые буферы или выделенные цели глубины для эффектов постобработки).это вызов, который фактически «отображает» (представляет) все, что было сделано для пользователя, и, следовательно, из самого определения в каждом кадре присутствует один подарок (поскольку именно этот подарок определяет кадр).

...