首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

D3D9的stretchrect和lockrect的有关问题

2013-07-29 
D3D9的stretchrect和lockrect的问题//IDirect3DDevice9 * pDev9传入参数//IDirect3DTexture9 *pVideoText

D3D9的stretchrect和lockrect的问题
//IDirect3DDevice9 * pDev9;传入参数
//IDirect3DTexture9 *pVideoTexture= NULL; 传入参数,创建属性如下
//hr = pDev9->CreateTexture(1920,1080, 1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, 
//&pVideoTexture, NULL);

HRESULT hr = E_FAIL;
IDirect3DSurface9 *pDriverComSurface = NULL;
IDirect3DSurface9 *pTempSurface = NULL;
IDirect3DSurface9 *pBackSurface = NULL,*pLeftSurface = NULL,*pRightSurface = NULL;
IDirect3DTexture9 *pTex_Left = NULL;
IDirect3DTexture9 *pTex_Right = NULL;
hr = pDev9->CreateTexture(1920, 1080+1, 1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTex_Left,NULL);
hr = pDev9->CreateTexture(1920,1080+ 1, 1,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTex_Right,NULL);
hr = pTex_Left->GetSurfaceLevel(0,&pLeftSurface); 
hr = pTex_Right->GetSurfaceLevel(0,&pRightSurface); 
hr = pVideoTexture->GetSurfaceLevel(0,&pTempSurface); 
hr = pDev9->StretchRect(pTempSurface,NULL,pLeftSurface,NULL,D3DTEXF_POINT);//
hr = pDev9->StretchRect(pTempSurface,NULL,pRightSurface,NULL,D3DTEXF_POINT);//
hr = pDev9->CreateOffscreenPlainSurface(1920*2, 1080+1,D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pDriverComSurface, NULL);
hr = pDev9->StretchRect(pLeftSurface,NULL,pDriverComSurface,NULL,D3DTEXF_POINT);
hr = pDev9->StretchRect(pRightSurface,NULL,pDriverComSurface,NULL,D3DTEXF_POINT);
D3DLOCKED_RECT lr;
hr = pDriverComSurface->LockRect(&lr,NULL,0);
(int *)(((unsigned char *) lr.pBits) + (lr.Pitch* 1080)) = 0xaabbccdd;
hr = pDriverComSurface->UnlockRect();
hr = pDev9->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
hr = pDev9->StretchRect(pDriverComSurface,NULL,pBackSurface,NULL,D3DTEXF_POINT);

不知为何,执行到“hr = pDriverComSurface->LockRect(&lr,NULL,0);”的时候就是不成功。创建pDev9的时候,属性是lockable的,不知道问题出在哪儿了。请高人指点迷津。
[解决办法]
D3DUSAGE_RENDERTARGET不能lock.
------解决方案--------------------


This method cannot retrieve data from a surface that is is contained by a texture resource created with D3DUSAGE_RENDERTARGET because such a texture must be assigned to D3DPOOL_DEFAULT memory and is therefore not lockable. In this case, use instead IDirect3DDevice9::GetRenderTargetData to copy texture data from device memory to system memory.

我看你的Usage为D3DUSAGE_RENDERTARGET,可以参考上面SDK文档中的方法,不使用LockRect来拷贝纹理数据,换成IDirect3DDevice9::GetRenderTargetData方法。
或者,创建纹理的时候,Usage使用D3DUSAGE_DYNAMIC,这样Pool为D3DPOOL_DEFAULT,LockRect就可用了。

热点排行