Захватить буфер с помощью DirectX 7 - PullRequest
0 голосов
/ 21 июня 2010

Я пытаюсь написать небольшой кусок кода, чтобы захватить буфер в массив пикселей. Раньше я почти не использовал DirectX, так как я больше поклонник OpenGL. Мое желание состоит в том, чтобы фактически заменить некоторый код в проекте, который захватывает буфер, используя BitBlt и DC, что очень медленно.
Это должно работать на всех компьютерах, поэтому я выбрал directx7.
У меня вопрос ... как бы я это сделал?
Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2011

Я использую вспомогательный класс для блокировки / разблокировки, как показано ниже. Тогда вы используете это так:

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 разблокируется, когда выходит из области действия

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 голосов
/ 21 июня 2010

TBH DirectX 9 будет работать даже с древними картами.У вас не все доступные функции, но у вас есть SHED загрузить больше полезной информации там.Хотя я думаю, что вы можете быть немного измотаны поддержкой Win 95/9 / me и выиграть 2K.Имейте в виду, что в NT4 никогда не было приличной версии DirectX.

Увы, у меня нет документов DX7 где-нибудь под рукой, но я уверен, что вы можете просто получить заднюю поверхность буфера и затем заблокировать ее, чтобыданные.Хотя вам нужно помнить, насколько медленным может быть захват заднего буфера, особенно на старых картах.Копирование заднего буфера из локальной видеопамяти в системную память через шину PCI или AGP невероятно медленное.

Чего именно вы пытаетесь достичь?Должны быть лучшие способы достичь того, что вы делаете после того, как ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...