2011-01-19 4 views
1

J'essaie d'obtenir un effet comme le fait le programme Fraps, qui est une superposition sur le dessus d'un jeu, et pour ce faire, j'accrocher la fonction IDirect3DDevice9::EndScene et le rendu avant d'appeler la fonction d'origine. Cependant, quand je rends des choses, cela gâche les effets que le jeu a déjà dessinés, et ne se dessine pas correctement. Mon crochet ressembleDirect3D hook overlay

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

    return endscene_orig(dev); 
} 

lequelR pGameOverlay est juste un pointeur vers une méthode de classe dont Render dessine juste des choses à l'appareil, il a été mis en place avec précédemment (non représenté). Y a-t-il autre chose que je devrais faire?

J'ai lu quelque part que Fraps accroche réellement la méthode Present, au lieu de EndScene. Est-ce correct, et si oui, pourquoi? Et ne pouvez-vous pas seulement avoir une paire BeginScene/EndScene entre les appels à Present?

+0

Juste comme une vérification de base que l'accrochage lui-même ne cause pas le désordre: quand vous ommitez le pGameOverlay-> Render(), tout semble-t-il OK? – Suma

+0

@Suma Oui, tout rend normalement quand je ne rends pas mes propres trucs. –

Répondre

4

Vous pouvez certainement avoir plusieurs BeginScene/EndScene pour chaque Présent, et c'est en fait une pratique assez courante. Habituellement, une paire de BeginScene/EndScene est utilisée pour chaque cible de rendu individuelle. (Un exemple de cible de rendu supplémentaire peut être un miroir, mais il existe de nombreuses autres utilisations pour plusieurs cibles de rendu, telles que les tampons d'ombre ou les cibles de profondeur dédiées aux effets de post-traitement). Hooking Present est beaucoup plus sûr, car c'est l'appel qui "affiche" réellement (Presents) tout ce qui a été fait à l'utilisateur, et donc de la définition même il y a un Present par frame (comme c'est exactement le cas présent). qui définit le cadre).

+0

Merci, c'est ce que j'avais besoin de savoir. –