使用DirectX 7抓取后备缓冲区

时间:2010-06-21 10:07:22

标签: windows directx

我正在尝试编写一小段代码来将后备缓冲区抓取到一个像素数组中。我之前几乎没有使用过directX,因为我更像是一个OpenGL粉丝。 我希望实际上替换一个项目中的一些代码,这个代码使用非常慢的BitBlt和DC来抓取后备缓冲区。
这应该适用于所有计算机,这就是我选择directx7的原因 我的问题是......我该怎么做? 谢谢。

2 个答案:

答案 0 :(得分:0)

TBH DirectX 9即使使用古代卡片也可以使用。您没有所有可用的功能,但您有一个SHED加载更多可用信息。虽然我认为你可能对Win 95/9 / me支持有点不知所措并赢得2K。请记住,NT4从来没有一个像样版本的DirectX。

唉我没有任何方便的DX7文档,但我很确定你可以获得后面的缓冲区表面,然后将其锁定以获取数据。虽然你需要记住抓住后缓冲器的速度有多慢,特别是在旧卡上。将后备缓冲区从本地视频内存复制到PCI或AGP总线上的系统内存非常慢。

你到底想要达到什么目的?必须有更好的方法来实现你的目标...

答案 1 :(得分:0)

我所做的是使用帮助程序类来执行锁定/解锁,如下所示。然后就像这样使用它:

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_;
};