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