使用 DirectX 7 获取后台缓冲区
Posted
技术标签:
【中文标题】使用 DirectX 7 获取后台缓冲区【英文标题】:Grabbing the backbuffer with DirectX 7 【发布时间】:2010-06-21 10:07:22 【问题描述】:我正在尝试编写一小段代码来将后台缓冲区抓取到像素数组中。我以前几乎没有使用过directX,因为我更喜欢OpenGL。 我的愿望是实际替换项目中的一些代码,这些代码使用非常慢的 BitBlt 和 DC 来获取后台缓冲区。 这应该适用于所有计算机,这就是我选择 directx7 的原因。 我的问题是..我该怎么做? 谢谢。
【问题讨论】:
【参考方案1】:我所做的是使用辅助类来执行锁定/解锁,如下所示。然后你像这样使用它:
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_;
;
【讨论】:
【参考方案2】:TBH DirectX 9 甚至可以使用古老的显卡。您没有所有可用的功能,但您有一个 SHED 加载更多可用信息。尽管我认为您可能对 Win 95/9/me 支持和赢得 2K 有点不耐烦。请记住,NT4 从来没有像样的 DirectX 版本。
唉,我手头没有 DX7 文档,但我很确定您可以只获取后台缓冲区表面,然后将其锁定以获取数据。尽管您需要记住抓取后台缓冲区的速度有多慢,尤其是在旧卡上。通过 PCI 或 AGP 总线将后台缓冲区从本地视频内存复制到系统内存非常慢。
您到底想达到什么目的?必须有更好的方法来实现你所做的......
【讨论】:
以上是关于使用 DirectX 7 获取后台缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
了解 DXGI DirectX 11 桌面复制以获取缓冲区或数组的问题
在 DirectX 11 中使用索引缓冲区;它是怎么知道的?
DirectX11--深入理解Effects11使用着色器反射机制(Shader Reflection)实现一个复杂Effects框架