D3D9的stretchrect和lockrect的问题

lvjadey 2012-06-13 05:09:32
//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的,不知道问题出在哪儿了。请高人指点迷津。
...全文
591 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunnypchen 2013-06-17
  • 打赏
  • 举报
回复
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就可用了。
lvjadey 2012-07-16
  • 打赏
  • 举报
回复
自己顶一下
lvjadey 2012-07-13
  • 打赏
  • 举报
回复
采用别的办法绕过这个难题了。此难题目前还没有找到办法。
zuotao0608 2012-07-12
  • 打赏
  • 举报
回复
可以联系我吗?QQ249215754
dengzikun 2012-06-14
  • 打赏
  • 举报
回复
D3DUSAGE_RENDERTARGET不能lock.

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧