BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int& width,int& height) { BOOL result = FALSE; IDirect3DSurface9 *_surfaceback = NULL; if (FAILED(m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &_surfaceback))) { result = FALSE; } D3DSURFACE_DESC surfaceDesc; if (!FAILED(_surfaceback->GetDesc(&surfaceDesc))) { width = surfaceDesc.Width; height = surfaceDesc.Height; } D3DLOCKED_RECT lockedRect; HRESULT hr = _surfaceback->LockRect( &lockedRect,0, 0); /* pointer to receive locked data鎸囧悜鐢寵鍒扮殑鍐呭瓨鍖哄煙*/ /* lock entire surface*/// no lock flags specified if (!FAILED(hr)) { pPixelBuffer = (DWORD*)lockedRect.pBits; result = TRUE; } _surfaceback->UnlockRect(); _surfaceback->Release(); return result; }
鐜板湪鍏抽敭鐨勯棶棰樺氨鍦ㄤ簬,璧勬簮閿佸畾鐨勬搷浣滈熷害鎬繪槸闈炲父涔嬫參.褰撶劧,浣犱細璺熸垜鎻? OpenGL浼間箮鑳藉蹇嵎鍦板畬鎴愯繖欏逛換鍔?浣嗘槸,鍦―irect3D涓?璧勬簮閿佸畾鎿嶄綔紜疄鏄緢鎱㈢殑.榪欓噷闈竴涓富瑕佺殑鍘熷洜鏄?API,椹卞姩,浠ュ強紜歡瑕佸鐞嗕竴浜涗笉鍙洖閬跨殑鍚庡彴鎿嶄綔.閭e氨鏄疓PU涓嶤PU鏄茍琛岃繍琛岀殑,鑻ヤ笉鍔犱換浣曟帾鏂?灝嗗紩璧風被浼煎綰跨▼紼嬪簭鍚屾鏃剁殑绔炴佹潯浠剁殑闂.
濡傛灉浣犺瘯鍥懼幓淇敼鐨勮祫婧愭鍚屾椂琚竴涓綅浜嶨PU澶勭悊搴忓垪涓殑鎸囦護浣跨敤,閭d箞鏁翠釜娓叉煋嫻佺▼灝變細鍥犱負浣犵殑璧勬簮閿佸畾鑰屽仠欏挎垨寮哄埗鍒鋒柊(stalls and flushes).鍋滈】(stall)浼氫竴鐩存寔緇埌浣犲畬鎴愪簡瀵硅祫婧愮殑淇敼騫惰皟鐢║nlock().鑰屽己鍒跺埛鏂?flush)鍒欎細瑕佹眰GPU鍦ㄤ綘寰楀埌榪欎釜璧勬簮鐨勮闂潈涔嬪墠瀹屾垚鐩墠鎵鏈夌殑浠誨姟.
濡備綍鍘昏В鍐寵繖涓棶棰橈紵涓嬮潰鐨勫弬鑰冭祫鏂欎腑鏈変竴浜涜В鍐蟲柟妗堬紝鎴戞病鏈夌粡榪囪鐪熸祴璇曪紝鎴戣瘯浜嗗叾涓竴涓狦etRenderTargetData 榪欐牱鐨勪竴縐嶆柟娉?錛屾劅瑙変笉澶ソ鐢紝why璇風湅Reference3
涓嬮潰緇欏嚭鎴戠殑瑙e喅鏂規
BOOL CD3DCameraViewWnd::GetImageInfo(DWORD* pPixelBuffer, int& width,int& height) { BOOL result = FALSE; IDirect3DSurface9 *_surfaceback = NULL; if (FAILED(m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &_surfaceback))) { result = FALSE; } D3DSURFACE_DESC surfaceDesc; if (!FAILED(_surfaceback->GetDesc(&surfaceDesc))) { width = surfaceDesc.Width; height = surfaceDesc.Height; }
LPDIREC3DSURFACE9 surf;
if(FAILED(m_pDevice->CreateOffscreenPlainSurface(width, height,D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM, &surf,NULL)))
{
result = FALSE;
}
D3DXLoadSurfaceFromSurface(surf, NULL,NULL,_surfaceback,NULL,NULL,D3DX_FILTER_NONE,0);
D3DLOCKED_RECT lockedRect;
HRESULT hr = surf->LockRect( &lockedRect,0, 0); /* pointer to receive locked data鎸囧悜鐢寵鍒扮殑鍐呭瓨鍖哄煙*/ /* lock entire surface*/// no lock flags specified
if (!FAILED(hr))
{
pPixelBuffer = (DWORD*)lockedRect.pBits;
result = TRUE;
}
surf->UnlockRect();
surf->Release();
_surfaceback->Release();
return result;
}
鍙傝冭祫鏂欙細Reference1.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673060.html
Reference 2.http://www.cnblogs.com/mixiyou/archive/2010/02/25/1673425.html
Reference 3.http://blog.csdn.net/Nightmare/article/details/1707362
Reference 4.http://www.cnblogs.com/lancidie/archive/2011/3/14.html