2011-08-18 17 views
0

我有一個用於DX9的WDDM用戶模式顯示驅動程序。現在我想將 渲染目標的後臺緩衝區轉儲到bmp文件。由於渲染目標資源是 不可鎖定,因此我必須從系統緩衝區和bitblt將渲染目標渲染到系統緩衝區,然後將系統緩衝區保存到bmp 文件。但是,調用bitblt總是返回錯誤代碼E_FAIL。我也 試圖調用也返回相同的錯誤代碼的pfnCaptureToSysMem。 這裏有什麼問題嗎?嘗試複製渲染目標的後緩衝時返回錯誤

D3DDDI_SURFACEINFO nfo; 
    nfo.Depth = 0; 
    nfo.Width = GetRenderSize().cx; 
    nfo.Height = GetRenderSize().cy; 
    nfo.pSysMem = NULL; 
    nfo.SysMemPitch = 0; 
    nfo.SysMemSlicePitch = 0; 

    D3DDDIARG_CREATERESOURCE resource; 
    resource.Format = D3DDDIFMT_A8R8G8B8; 
    resource.Pool = D3DDDIPOOL_SYSTEMMEM; 
    resource.MultisampleType = D3DDDIMULTISAMPLE_NONE; 
    resource.MultisampleQuality = 0; 
    resource.pSurfList = &nfo; 
    resource.SurfCount = 1; 
    resource.MipLevels = 1; 
    resource.Fvf = 0; 
    resource.VidPnSourceId = 0; 
    resource.RefreshRate.Numerator = 0; 
    resource.RefreshRate.Denominator = 0; 
    resource.hResource = NULL; 
    resource.Flags.Value = 0; 
    resource.Flags.Texture = 1; 
    resource.Flags.Dynamic = 1; 
    resource.Rotation = D3DDDI_ROTATION_IDENTITY; 

    HRESULT hr = m_pDevice->m_deviceFuncs.pfnCreateResource(m_pDevice->GetDrv(), &resource); 
    HANDLE hSysSpace = resource.hResource; 

    D3DDDIARG_BLT blt; 
    blt.hSrcResource = m_pDevice->m_hRenderTarget; 
    blt.hDstResource = hSysSpace; 
    blt.SrcRect.left = 0; 
    blt.SrcRect.top = 0; 
    blt.SrcRect.right = GetRenderSize().cx; 
    blt.SrcRect.bottom = GetRenderSize().cy; 
    blt.DstRect = blt.SrcRect; 
    blt.DstSubResourceIndex = 0; 
    blt.SrcSubResourceIndex = 0; 
    blt.Flags.Value = 0;   
    blt.ColorKey = 0; 

    hr = m_pDevice->m_deviceFuncs.pfnBlt(m_pDevice, &blt); 

回答

0

你走的是正確的軌道,但我認爲你可以使用DirectX的功能。

爲了將渲染目標從視頻內存複製到系統內存,您應該使用IDirect3DDevice9::GetRenderTargetData()函數。

該函數要求目標曲面是使用池D3DPOOL_SYSTEMMEM創建的離屏平面曲面。該表面也必須與渲染目標尺寸相同(不允許拉伸)。使用IDirect3DDevice9::CreateOffscreenPlain()來創建這個表面。

然後可以鎖定該表面,並可以通過CPU訪問顏色數據。

相關問題