使用 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 获取后台缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

修复 Windows 7 上的 DirectX 7 延迟?

了解 DXGI DirectX 11 桌面复制以获取缓冲区或数组的问题

在 DirectX 表面缓冲区上执行转置操作

DirectX11--深入理解与使用缓冲区资源

在 DirectX 11 中使用索引缓冲区;它是怎么知道的?

DirectX11--深入理解Effects11使用着色器反射机制(Shader Reflection)实现一个复杂Effects框架