2010-06-21 5 views
0

J'essaye d'écrire un petit morceau de code pour saisir le backbuffer dans un tableau de pixels. J'ai à peine utilisé DirectX auparavant car je suis plutôt fan d'OpenGL. Mon souhait est de remplacer réellement du code dans un projet qui saisit le backbuffer en utilisant BitBlt et DC qui est très lent.
Ceci est supposé fonctionner sur tous les ordinateurs et c'est pourquoi j'ai choisi DirectX7.
Ma question est .. comment ferais-je cela?
Merci.Saisir le backbuffer avec DirectX 7

Répondre

0

Ce que je fais est d'utiliser une classe d'assistance pour faire le verrouillage/déverrouillage comme ci-dessous. Ensuite, vous l'utilisez comme ceci:

mBackBuffer->Flip(DDFLIP_WAIT); 

{ 
    DDSURFACEDESC2 ddsd; 
    ZeroMemory(&ddsd, sizeof(ddsd)); 
    ddsd.dwSize = sizeof(ddsd); 

    ReadLock r(mBackBuffer, ddsd, NULL /* for whole surface */); 

    if (r) 
    { 
     // ddsd.lpSurface contains the void* pointer to the bytes 
     // ddsd.lPitch contains the byte count of each horizontal line 
    } 

} // READLOCK débloque quand il est hors de portée

class ReadLock 
{ 
    public: 
     ReadLock(IDirectDrawSurface7* surface, DDSURFACEDESC2& ddsd, LPRECT pRect = 0) : surface_(surface), mpRect(pRect), hr(S_OK) 
     { 
      hr = surface_->Lock(mpRect, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_NOSYSLOCK | DDLOCK_WAIT | DDLOCK_READONLY, 0); 
     } 

     HRESULT getResult() const { return hr; } 
     bool operator!() const { return FAILED(hr); } 
     operator bool() const { return SUCCEEDED(hr); } 

     ~ReadLock() 
     { 
      if (surface_ && SUCCEEDED(hr)) 
       surface_->Unlock(mpRect); 
     } 

    private: 
     HRESULT hr; 
     RECT* mpRect; 
     IDirectDrawSurface7* surface_; 
}; 
0

TBH DirectX 9 fonctionne même avec des cartes anciennes. Vous n'avez pas toutes les fonctionnalités disponibles, mais vous disposez d'une charge SHED plus d'informations utilisables là-bas. Bien que je pense que vous pourriez être un peu crevé sur Win 95/9/moi soutenir et gagner 2K. Gardez à l'esprit NT4 n'a jamais eu une version décente de DirectX. Malheureusement, je n'ai pas les documents DX7 à portée de main, mais je suis assez sûr que vous pourriez juste obtenir la surface du tampon arrière, puis le verrouiller pour obtenir les données. Bien que vous ayez besoin de garder à l'esprit la lenteur à saisir le tampon arrière, surtout sur les vieilles cartes. Copier le tampon arrière de la mémoire vidéo locale vers la mémoire système sur le bus PCI ou AGP est incroyablement lent.

Qu'essayez-vous exactement d'accomplir? Il doit y avoir de meilleurs moyens pour réaliser ce que vous êtes en train de faire ...